Перевод исключений SAX
У меня есть некоторый 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 ответ
Ну, кажется, мне пришлось добавить 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: Обнаружено недопустимое содержимое, начиная с элемента 's:cID'. Ожидается один из {{http://www.mycompany.ca/schema":tdr}.
Сразу же следуют:
http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.mycompany.com/schema":tdr}
Двойная ошибка раздражает, но, по крайней мере, первая из них пригодна для использования...