Я пытаюсь проверить простейший из возможных файлов 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
.
Итак, у меня есть два вопроса:
- почему синтаксический анализатор не может обработать
XMLSchema.xsd
пролог XML? и есть ли способ исправить это, не редактируя файлXMLSchema.xsd
? - если нет пути №1, как я могу загрузить файл
XMLSchema.xsd
с http://www.w3.org/2001/XMLSchema.xsd без пролога XML, поэтому мне не нужно редактировать вручную. Простойwget
также извлекает пролог XML (который, кстати, не появляется при переходе по ссылке в браузере).
Это действительно слишком много, чтобы предоставить SSCCE, но если кто-то захочет взглянуть, я предоставлю репозиторий github с тестовым примером.
org.w3c.dom.Document
; на объектеDocumentBuilderFactory
, который я вызываю:setValidating(false);
- person Marcus Junius Brutus   schedule 02.09.2014Validator
, который я использую, относится к классу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