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

时间:2015-04-21 06:36:38

标签: xml xsd

我正在使用xsd验证xml文档。通过使用sax解析器,它成功验证。但是当我们使用DOM解析器时,它会给出错误 " Validator类:com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl

org.xml.sax.SAXParseException; cvc-elt.1:找不到元素的声明'图表'。"



**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">
&#13;
&#13;
&#13;

编辑:

简化的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>

简化的XML(xml1.xml):

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

要重现的最小代码:

// 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);

1 个答案:

答案 0 :(得分:0)

  

你的targetNamespace定义很不寻常(它看起来像一个前缀   声明本身)。此外,它使用'保留'xsi前缀   通常由“Xml Schema Instance”使用。

     

这个“假”xmlns:xsi可能会欺骗DOM验证   不知怎的前缀,你可以尝试使用另一个名称空间值   xmlns:xsi看看你是否有不同的结果?

修改

经过一些搜索,这是因为DOM created is not namespace-aware。要修复它,您只需将documentBuilder设置为名称空间感知:

factory.setNamespaceAware(true);

这解决了我的问题。