Я хочу проверить XML-файл (который не имеет пространства имен или объявления схемы в файле XML) в отношении файла XSD.Xerces XMLSchemaFactory: не удается найти объявление элемента
файл XML выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<report> ... </report>
И файл XSD, является:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="report">
...
</xs:element>
</xs:schema>
код аналогичен следующему:
SchemaFactory xsdFac = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
xsdFac.setErrorHandler(...);
Schema xsd = xsdFac.newSchema(xsdUrl); // xsdUrl works
Validator xsdValidator = xsd.newValidator();
xsdValidator.validate(new DOMSource(doc)); // doc is correct
Я провел 3 часов на этом, так как он работает локально на моем ПК, он работал на сервере (я думаю), но теперь он не работает на сервере. Я попытался определить различия между моим ПК и сервером, но оба они используют одни и те же JAR и т. Д.
В любом случае, я определил следующую разницу. Я не передавал имя класса методу SchemaFactory.newInstance
(почти наверняка mistake), когда я распечатал имя класса xsdFac
, я видел, что он отличается от локального и на сервере. Я не думаю, что хочу понять, почему это так (я понятия не имею), я думаю, что лучше найти тот, который работает, и явно указать его.
- На моем компьютере (работает) он был
com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory
. Если я явно укажу, что на вызовеnewInstance
он работает на ПК и на сервере. - На сервере (не было), было
org.apache.xerces.jaxp.validation.XMLSchemaFactory
. Если я явно установил это на вызовnewInstance
, я получаю ту же ошибку как на ПК, так и на сервере.
Обратите внимание на com.sun
в начале работы, которая работает.
Так что, по крайней мере, у меня есть решение, это хорошо. Но, я думаю, я не должен использовать классы com.sun
явно в моем коде?
Другая информация:
- Ошибки я получаю:
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'report'
- Это та же ошибка, я получаю, когда на рабочей версии, изменить имя элемента на что-то другое, что-то, что Безразлично» t существуют в схеме. Поэтому я думаю, что это просто означает: «Я понимаю вашу схему, и я понимаю XML, и вы использовали элемент, который не был объявлен нигде в схеме».
xercesImpl-2.9.1.jar
находится в моем проекте (как на сервере, так и на ПК).- Этот JAR содержит
XMLSchemaFactory.class
под пакетом, указанным в нерабочей версии (т.привел бы меня поверить, что там, обнаружимый, и должен работать, а ведь я не получаю какое-либо исключение, относящиеся к классам не найден) doc
объекта Я разбор, в обеих случаяхorg.apache.xerces.dom.DeferredDocumentImpl
Итак, мой вопрос: я хотел бы использовать явную реализацию Xerces фабрики схем (я думаю), поскольку я включаю JAR, и у меня есть объект Document из Xerces, и в основном я использую валидатор Xerces в любом случае (в рабочем случае com.sun
).
Имеет ли кто-либо подобный опыт?
Хорошо, спасибо, я дам вам повод и вернусь к вам! Но система (в случае сбоя) создала экземпляр 'org.apache.xerces.jaxp.validation.XMLSchemaFactory' (я получил это имя класса, выполнив' System.out.println (fac.getClass()) ', поэтому Я думаю, что это должно быть на пути к классу? –
Да, это звучит многообещающе. Но вы могли бы каким-то образом умудряться получить странную смесь Xerces и non-Xerces. Подождите, я неправильно понял. – bmargulies
Да, я чувствую, что «странная смесь «Это именно то, что происходит, хотя я не могу это доказать. Я имею в виду, что документ не соответствует схеме (но никаких других ошибок, таких как класс не найден), когда доступны XML и XSD-файл, и еще одна реализация говорит, что все в порядке, .... хм. –