我花了2个多小时才完成这件事。我无法弄清楚为什么会出现这种错误。我有一个简单的xsd和xml代码
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root_element" type="string"/>
</schema>
xsd文件:
<?xml version="1.0" encoding="UTF-8"?>
<root_element>"asd"</root_element>
我的java代码是:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
SchemaFactory s_factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
dbf.setSchema(s_factory.newSchema(new File(schemafile)));
dbf.setValidating(true);
dbf.setFeature("http://apache.org/xml/features/validation/schema", true);
DocumentBuilder db = dbf.newDocumentBuilder();
CommodityPropsErrorHandler cp_eh = new CommodityPropsErrorHandler();
db.setErrorHandler(cp_eh);
Document doc = db.parse(new File(props_file));
任何评论都会有所帮助。问候
答案 0 :(得分:3)
我认为主要问题是:
dbf.setValidating(true);
根据Java API,DocumentBuilderFactory.setValidating
:
指定此代码生成的解析器将验证 解析文档。默认情况下,此值设置为 假的。
请注意,“验证”在此处表示已定义的验证解析器 在XML推荐中。换句话说,它基本上只是 控制DTD验证。 (传统的两个属性除外 在JAXP 1.2中定义。)
使用现代架构语言,例如W3C XML Schema或RELAX NG 您可以将解析器配置为非验证,而不是DTD 解析器,然后将setValidating(boolean)方法保留为 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));
答案 1 :(得分:2)
此行用于使验证命名空间感知。否则,它将使文档中没有元素。
dbf.setNamespaceAware(true);