我认为主要问题在于:
dbf.setValidating(true);
根据Java API,DocumentBuilderFactory.setValidating http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#setValidating%28boolean%29:
指定此代码生成的解析器将验证
解析文档时。默认情况下,该值设置为
错误的。
请注意,这里的“验证”是指定义的验证解析器
在 XML 推荐中。换句话说,它本质上是只是
控制 DTD 验证。 (除了遗留的两个属性
JAXP 1.2 中定义。)
使用现代模式语言,例如 W3C XML Schema 或 RELAX NG
您可以将解析器配置为非验证性
解析器保留 setValidating(boolean) 方法false, 然后
使用设置架构(架构)将模式与解析器关联的方法。
另外你也不需要:
dbf.setFeature("http://apache.org/xml/features/validation/schema", true);
您的工作代码可能只是(但是我不知道里面是什么CommodityPropsErrorHandler
class):
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);
(也就是说,使用 Java API 中提到的 JAXP 中的这两个属性):
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));