简体   繁体   English

使用DOM和SAX解析器针对xsd进行xml验证

[英]xml validation against xsd with DOM and SAX parser

i am validating xml document with xsd. 我正在使用xsd验证xml文档。 By using sax parser it successfully validates. 通过使用sax解析器,它可以成功验证。 But when we use DOM parser it gives error that " Validator Class: com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl 但是,当我们使用DOM解析器时,它会给出以下错误:“验证器类:com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl

org.xml.sax.SAXParseException; org.xml.sax.SAXParseException; cvc-elt.1: Cannot find the declaration of element 'diagram'." cvc-elt.1:找不到元素'diagram'的声明。”

 **XSD File** <?xml version="1.0" encoding="UTF-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="xmlns:xsi" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="diagram"> <xs:complexType> <xs:sequence> ---- ---- ---- **XML File** <?xml version="1.0" encoding="UTF-8"?> <diagram xmlns="xmlns:xsi"> <class name="Customer"> 

EDIT: 编辑:

Simplified XSD (schema1.xsd) 简化的XSD(schema1.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="xmlns:xsi" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="diagram">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="class" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Simplified XML (xml1.xml): 简化的XML(xml1.xml):

<diagram xmlns="xmlns:xsi">
    <class>classe</class>
</diagram>

Minimal code to reproduce: 最少的代码可重现:

// load document
// Get Document Builder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

// Build Document
Document doc = builder.parse(new File("./resources/xml1.xml"));

SchemaFactory aSF = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = aSF.newSchema(new File("schema1.xsd"));
Validator validator = schema.newValidator();

Source dsource = new DOMSource(doc);
validator.validate(dsource);

your targetNamespace definition is unusual (it looks like a prefix declaration in itself). 您的targetNamespace定义不寻常(它本身看起来像一个前缀声明)。 Moreover it is using the 'reserved' xsi prefix which is generally used by "Xml Schema Instance". 此外,它使用的是“保留” xsi前缀,通常由“ Xml Schema Instance”使用。

Maybe the DOM validation is getting tricked by this "fake" xmlns:xsi prefix somehow, can you try with another namespace value than xmlns:xsi to see if you have different result ? 也许DOM验证正以某种“假” xmlns:xsi前缀被欺骗,您是否可以尝试使用除xmlns:xsi之外的另一个名称空间值来查看结果是否不同?

EDIT 编辑

After a bit of search, it is because the DOM created is not namespace-aware . 经过一番搜索,这是因为创建DOM不支持名称空间 To fix it you should simply set your documentBuilder as namespace-aware: 要修复它,您只需将documentBuilder设置为可识别名称空间:

factory.setNamespaceAware(true);

This was fixing the issue in my case. 这正在解决我的问题。

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

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