Перевод исключений SAX - PullRequest
2 голосов
/ 26 ноября 2010

У меня есть некоторый код Java, который проверяет XML на соответствие XSD. Я использую измененную версию обработчика ошибок, найденную здесь: http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html, чтобы перехватывать и регистрировать ВСЕ исключения во время проверки.

Ошибки очень краткие, они выглядят примерно так:

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.myschema.com/schema":txn}

Другие сообщения, такие как

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:attributes&{"http://www.myschema.com/schema":sequence}

еще более загадочны.

Есть ли простой способ получить ясное и понятное сообщение из SAX, объясняющее, что здесь пошло не так? Я думаю, что в первой ошибке он ожидал txn и вместо этого нашел элемент cID. НО ... Я не знаю всех возможных ошибок, которые могут генерировать SAX, поэтому я бы не стал пытаться вручную создавать таблицу перевода.

Возможные пользователи этого вывода в основном нетехнические, поэтому мне нужно иметь возможность генерировать простые и понятные сообщения, такие как «элемент txn был вне последовательности».

Если это поможет, вот код (более или менее), который используется для проверки:

Source schema1 = new StreamSource(new File("resources/schema1.xsd"));
Source schema2 = new StreamSource(new File("resources/schema2.xsd"));
Source[] sources = {schema1,schema2};
validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(sources).newValidator();
ErrorHandler lenient = new ForgivingErrorHandler();
validator.setErrorHandler(lenient);

В другом месте ...

StreamSource xmlSource = new StreamSource(new StringReader(XMLData) );
try
{
    validator.validate(xmlSource);
}
catch (SAXException e)
{
    logger.error("XML Validation Error: ",e);
}

1 Ответ

0 голосов
/ 30 ноября 2010

Что ж, похоже, мне пришлось добавить xsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd " к документу XML, потому что s:http://www.mycompany.com/schema является пространством имен по умолчанию: xmlns="s:http://www.mycompany.com/schema".Конечно, у меня нет доступа для изменения инструмента, который генерирует XML, поэтому понадобился следующий ужасный хак:

xmlDataStr = xmlDataStr.replace("<rootNode ", "<rootNode xsi:schemaLocation=\"http://www.mycompany.com/schema resources/schema1.xsd \" ");

... конечно, теперь я получаю двойные ошибки проверки!Ясный и понятный, такой как:

cvc-complex-type.2.4.a: Invalid content was found starting with element 's:cID'. One of '{"http://www.mycompany.ca/schema":tdr}' is expected.

Сразу же следует:

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.mycompany.com/schema":tdr}

Двойная ошибка раздражает, но по крайней мере первая из них пригодна для использования ...

...