проверить схему XML на соответствие XMLSchema.xsd

Я пытаюсь проверить простейший из возможных файлов XSD на соответствие XMLSchema.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="a" type="xs:int"/>
</xs:schema>

С этой целью я загрузил файл XMLSchema.xsd и передал его своему org.w3c.dom.ls.LSResourceResolver, чтобы убедиться, что XMLSchema.XSD, предоставленный локально, используется, а не получен через Интернет. Код работает с Saxon-HE-9.4.jar в моем пути к классам.

Однако это не удается:

org.xml.sax.SAXParseException; cvc-elt.1: не удается найти объявление элемента "xs: schema".

который, похоже, связан с предыдущим сообщением (отправленным моим настраиваемым подклассом LSResourceResolver):

Не удалось прочитать документ схемы '[...] XMLSchema.xsd', потому что 1) не удалось найти документ; 2) документ не читается; 3) корневой элемент документа не ‹xsd: schema›.

Однако когда я закомментирую весь раздел DOCTYPE в файле XMLSchema.XSD, он работает.

Я предполагаю, что это означает, что синтаксический анализатор не может обрабатывать предложения DOCTYPE и ATTLIST в XMLSchema.xsd.

Итак, у меня есть два вопроса:

  1. почему синтаксический анализатор не может обработать XMLSchema.xsd пролог XML? и есть ли способ исправить это, не редактируя файл XMLSchema.xsd?
  2. если нет пути №1, как я могу загрузить файл XMLSchema.xsd с http://www.w3.org/2001/XMLSchema.xsd без пролога XML, поэтому мне не нужно редактировать вручную. Простой wget также извлекает пролог XML (который, кстати, не появляется при переходе по ссылке в браузере).

Это действительно слишком много, чтобы предоставить SSCCE, но если кто-то захочет взглянуть, я предоставлю репозиторий github с тестовым примером.


person Marcus Junius Brutus    schedule 02.09.2014    source источник
comment
Просто интересно: вы используете DOM Document? Если да, то при создании вы установили для проверки значение false или оставили значение по умолчанию true?   -  person nablex    schedule 02.09.2014
comment
@nablex да, файл читается как org.w3c.dom.Document; на объекте DocumentBuilderFactory, который я вызываю: setValidating(false);   -  person Marcus Junius Brutus    schedule 02.09.2014
comment
Вы отметили это как saxon, так и xerces. Оба из них предоставляют валидаторы схемы, но вы не указали, какие именно вы используете. Из сообщений об ошибках у меня создается впечатление, что вы используете валидатор схемы xerces; так почему вы отметили вопрос саксоном?   -  person Michael Kay    schedule 04.09.2014
comment
@MichaelKay, ты прав, Validator, который я использую, относится к классу org.apache.xerces.jaxp.validation.ValidatorImpl. На самом деле я просто делаю Validator validator = schema.newValidator(), и поскольку я использую saxon только как зависимость, я предполагал, что использовался валидатор Saxon. По-видимому, saxon вводит Xerces и Xalan в качестве транзитивных зависимостей, и поэтому в конечном итоге используется валидатор Xerces. Есть ли способ более четко контролировать, какой валидатор создается? Я удалил тег saxon.   -  person Marcus Junius Brutus    schedule 04.09.2014
comment
Если вы хотите выполнить проверку схемы с помощью Saxon через интерфейсы JAXP, вы можете сделать это с помощью интерфейса фабрики схемы JAXP, но не путем установки свойств проверки в синтаксическом анализаторе XML, поскольку средство проверки Saxon не интегрировано с анализатором, это бесплатно- стоя.   -  person Michael Kay    schedule 05.09.2014


Ответы (1)


Если ссылка на XMLSchema.dtd не работает, то одно очевидное решение (помимо комментариев к объявлению DOCTYPE, которое вы уже нашли) - загрузить файлы DTD (XMLSchema.dtd и datatypes.dtd) и предоставить их. и локально.

person C. M. Sperberg-McQueen    schedule 02.09.2014