Я думаю, что главная проблема с:
dbf.setValidating(true);
Согласно Java API, DocumentBuilderFactory.setValidating
:
Указывает, что анализатор, созданный этим кодом, будет проверять
документы как они разбираются. По умолчанию это значение установлено на
ложь.
Обратите внимание, что здесь «валидация» означает валидирующий парсер, как определено
в рекомендации XML. Другими словами, это по сути просто
управляет проверкой DTD . (кроме наследства двух свойств
определено в JAXP 1.2.)
Для использования современных языков схемы, таких как XML-схема W3C или RELAX NG
вместо DTD вы можете настроить свой парсер на без проверки
парсер , оставив метод setValidating (логический) false , затем
используйте метод setSchema (Schema) , чтобы связать схему с анализатором.
Также вам не нужно:
dbf.setFeature("http://apache.org/xml/features/validation/schema", true);
Ваш рабочий код, вероятно, просто (однако я не знаю, что находится в CommodityPropsErrorHandler
классе):
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
SchemaFactory s_factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
dbf.setSchema(s_factory.newSchema(new File(schemafile)));
DocumentBuilder db = dbf.newDocumentBuilder();
CommodityPropsErrorHandler cp_eh = new CommodityPropsErrorHandler();
db.setErrorHandler(cp_eh);
Document doc = db.parse(new File(props_file));
Вот второй, альтернативный подход с предыдущим dbf.setValidating(true);
(то есть с использованием этих двух свойств из JAXP, упомянутых в Java API):
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
XMLConstants.W3C_XML_SCHEMA_NS_URI);
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",
new File(schemafile));
DocumentBuilder db = dbf.newDocumentBuilder();
CommodityPropsErrorHandler cp_eh = new CommodityPropsErrorHandler();
db.setErrorHandler(cp_eh);
Document doc = db.parse(new File(props_file));