首页 > 解决方案 > 针对 XSD 验证 XML 文档返回错误“未声明元素”

问题描述

我正在尝试针对 XSD 文档验证 XML 文档。

这是我的 XML:

 <?xml version="1.0" encoding="utf-8"?>
<ArrayOfProduct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Product IdProduct="1" NameProduct="1" PriceProduct="1" availability="1" IdSup="1" />
</ArrayOfProduct>

这是我的 XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/Products">
  <xs:element name="ArrayOfProduct">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Product"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Product">
    <xs:complexType>
      <xs:attribute name="PriceProduct" use="required" type="xs:integer"/>
      <xs:attribute name="IdSup" use="required" type="xs:integer"/>
      <xs:attribute name="IdProduct" use="required" type="xs:integer"/>
      <xs:attribute name="NameProduct" use="required" type="xs:integer"/>
      <xs:attribute name="availability" use="required" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

这是我的 C# 代码:

XmlReaderSettings ProductSettings = new XmlReaderSettings();
ProductSettings.Schemas.Add("http://www.contoso.com/Products", "XmlSchema.xsd");
ProductSettings.ValidationType = ValidationType.Schema;
ProductSettings.ValidationEventHandler += new ValidationEventHandler(ProductSettingsValidationEventHandler);
XmlReader Products = XmlReader.Create(doc + ".xml", ProductSettings);
while (Products.Read()) { }

每次我尝试根据我的 XSD 文档验证我的 XML 文档时,我都会收到一个错误:

未声明 Product 元素。

标签: xmlxsdxml-namespacesxsd-validationxml-validation

解决方案


如果您进行这两项更改,您的 XML 将根据您的 XSD 有效:

  1. 将默认命名空间添加到您的 XML 以匹配 XSDtargetNamespace.
  2. 调整 XSD 中的ref="Product"引用以包含 XSD 的命名空间前缀targetNamespace

XML

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfProduct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns="http://www.contoso.com/Products">
    <Product IdProduct="1" NameProduct="1" 
             PriceProduct="1" availability="1" IdSup="1" />
</ArrayOfProduct>

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified" 
           targetNamespace="http://www.contoso.com/Products"
           xmlns:p="http://www.contoso.com/Products">
  <xs:element name="ArrayOfProduct">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="p:Product"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Product">
    <xs:complexType>
      <xs:attribute name="PriceProduct" use="required" type="xs:integer"/>
      <xs:attribute name="IdSup" use="required" type="xs:integer"/>
      <xs:attribute name="IdProduct" use="required" type="xs:integer"/>
      <xs:attribute name="NameProduct" use="required" type="xs:integer"/>
      <xs:attribute name="availability" use="required" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

推荐阅读