【问题标题】:org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'tns:root_element'org.xml.sax.SAXParseException: cvc-elt.1: 找不到元素“tns:root_element”的声明
【发布时间】:2011-10-31 11:36:21
【问题描述】:

我已经为此花费了 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));

任何 cmets 都会有所帮助。问候

【问题讨论】:

  • 这不可能是一切。某处引用了您尚未发布的命名空间前缀 tns:

标签: java xml xsd schema


【解决方案1】:

我认为主要问题在于:

dbf.setValidating(true);

根据 Java API,DocumentBuilderFactory.setValidating

指定此代码生成的解析器将验证 文件被解析。默认情况下,此值设置为 假的。

请注意,这里的“验证”是指定义的验证解析器 在 XML 推荐中。换句话说,它本质上只是 控制 DTD 验证。 (除了遗留的两个属性 在 JAXP 1.2 中定义。)

使用现代模式语言,例如 W3C XML Schema 或 RELAX NG 代替 DTD,您可以将解析器配置为 非验证 parser 离开 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));

【讨论】:

    【解决方案2】:

    这一行是为了让验证命名空间感知。否则它将给出文档中不存在的元素。

    dbf.setNamespaceAware(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 2020-05-08
      • 2015-11-25
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多