Вопрос

У меня есть какой-то код 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}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top