Программное определение того, какой узел в документе XML вызвал сбой проверки его XML-схемы - PullRequest
5 голосов
/ 07 июня 2010

Мой ввод - это правильно сформированный документ XML и соответствующий документ схемы XML.То, что я хотел бы сделать, это определить местоположение в документе XML, которое приводит к тому, что он не проходит проверку по документу схемы XML.Я не мог понять, как сделать это, используя стандартный подход проверки в Java:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(... /* the .xsd source */);
Validator validator = schema.newValidator();
DocumentBuilderFactory ...
DocumentBuilder ...
Document document = DocumentBuilder.parse(... /* the .xml source */);
try {
    validator.validate(new DOMSource(document));
    ...
} catch (SAXParseException e) {
    ...
}

Мне пришла в голову идея получить хотя бы номер строки и столбца из SAXParseException, но они всегда установлены-1, -1 при ошибке проверки.

Ответы [ 3 ]

1 голос
/ 14 июня 2010

DOM не сохраняет информацию о своем источнике - в большинстве случаев это не имеет значения, и DOM предназначен для манипулирования (т. Е. Любая информация о местоположении будет неправильной).

Решение заключается в проверке во время анализа: вызовите DocumentBuilderFactory.setSchema () перед созданием DocumentBuilder.

0 голосов
/ 09 июня 2010

Взгляните на проект https://jaxb2 -commons.dev.java.net / xpath-tracker / .Он был разработан для Jaxb, но я думаю, что он будет работать вне этого, так как это XMLFilter.

0 голосов
/ 08 июня 2010

Вы не будете получать сообщения об ошибках проверки схемы таким образом. Если вам действительно нужна информация о строках и столбцах, вам нужно установить обработчик ошибок, т.е.

try {
   validator.setErrorHandler(handler);
   validator.validate(...);
} catch (SAXParseException e) {
   // Use handler info, or log it in handler
}

Вот интерфейс, который вам нужно реализовать: ErrorHandler

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...