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