org.xml.sax.SAXParseException:cvc-elt.1:找不到元素“tns:root_element”的声明

2023-12-31

我已经花了过去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));

任何评论都会有帮助。问候


我认为主要问题在于:

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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

org.xml.sax.SAXParseException:cvc-elt.1:找不到元素“tns:root_element”的声明 的相关文章

随机推荐