![](/img/trans.png)
[英]root-context.xml] is invalid; nested exception is org.xml.sax.SAXParseException; cvc-elt.1: Cannot find the declaration of element 'beans'
[英]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.