繁体   English   中英

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

[英]org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'tns:root_element'

我花了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

指定此代码生成的解析器将在解析文档时对其进行验证。 默认情况下,this的值设置为false。

请注意,“验证”在此处表示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));

此行用于使验证命名空间感知。 否则它会给文档中没有元素。

dbf.setNamespaceAware(true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM