2011-02-19 1 views
2

Я хочу проверить 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).

Имеет ли кто-либо подобный опыт?

ответ

2

Я бы рискнул предположить, что на самом деле у вас нет Xerces на пути к классам в случае отказа.

-Djaxp.debug обязательно сообщит вам, какая реализация активна, когда вы вызываете JISX APIS, который вы вызываете.

Если это так, и это не просто результат ошибки в вашем пути к классу, вы действительно можете специально «новых» классов Xerces вместо вызова стандартных фабричных методов JAXP. Я сделал это.

редактировать

комментарии показывают, что это веб-приложение. Классы JAXP - одна из тех вещей, которые болезненно ставить в webapp, учитывая правила загрузки классов. Вы должны хотя бы попытаться поместить его в «путь» класса «tomcat» и посмотреть, что произойдет.

+0

Хорошо, спасибо, я дам вам повод и вернусь к вам! Но система (в случае сбоя) создала экземпляр 'org.apache.xerces.jaxp.validation.XMLSchemaFactory' (я получил это имя класса, выполнив' System.out.println (fac.getClass()) ', поэтому Я думаю, что это должно быть на пути к классу? –

+0

Да, это звучит многообещающе. Но вы могли бы каким-то образом умудряться получить странную смесь Xerces и non-Xerces. Подождите, я неправильно понял. – bmargulies

+0

Да, я чувствую, что «странная смесь «Это именно то, что происходит, хотя я не могу это доказать. Я имею в виду, что документ не соответствует схеме (но никаких других ошибок, таких как класс не найден), когда доступны XML и XSD-файл, и еще одна реализация говорит, что все в порядке, .... хм. –