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

时间:2011-08-21 05:30:15

标签: java xml xsd schema

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

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

2 个答案:

答案 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);