使用XSD进行XML验证失败

时间:2017-08-10 23:38:16

标签: c# xml xsd

我遇到一个问题,一个简单的 XSD 通过XmlSchemaSet对象加载, XML 使用XmlReaderSettings

加载

这是我的XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="A">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="B">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="C" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType mixed="true">
                  <xs:sequence>
                    <xs:element name="Properties" minOccurs="0">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Item" minOccurs="0">                            
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

以下XML将在第5行生成错误(“无法找到属性'Name'.at第5:11行的架构信息:

<A>
    <B>
        <C>
            <Properties>
                <Item Name="OBJECT">
                    <Item Name="CONTENT"/>
                </Item>
            </Properties>
        </C>
    </B>
</A>

我的XSD出了什么问题?

2 个答案:

答案 0 :(得分:0)

您缺少第二级项目及其属性的定义。

以下内容应位于您的顶级项目

之下
@drawable/mydrawable_inset

所以看起来像这样

                        <xs:complexType>
                          <xs:sequence>
                            <xs:element name="Item">
                              <xs:complexType>
                                <xs:attribute name="Name" type="xs:string" use="required" />
                              </xs:complexType>
                            </xs:element>
                          </xs:sequence>
                          <xs:attribute name="Name" type="xs:string" use="required" />
                        </xs:complexType>

如果您只需要一个级别的项目,或者您的第一个项目应该是自我终止的。但即便如此,您还必须定义属性。

答案 1 :(得分:0)

我认为您的XSD没有任何问题,您的架构处理器出了问题。以下是撒克逊报道的内容:

Saxon-EE 9.8.0.3J from Saxonica
Java version 1.8.0_121
Using license serial number V005192
Loading schema document file:/Users/mike/Desktop/temp/test.xsd
Finished loading schema document file:/Users/mike/Desktop/temp/test.xsd
Schema checking successful. Time: 738ms. Memory: 37Mb.
Using parser org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser
Processing file:/Users/mike/Desktop/temp/test.xml
Validation time: 244ms. Memory: 40Mb.
Validation successful

Item的元素声明既没有simpleTypecomplexType子元素,也没有type属性。 XSD第1部分中的相关规则在§3.3.2中,其中表示有效{类型定义}为:

  

<simpleType><complexType>对应的类型定义   [children]中的元素信息项,如果存在,   否则类型定义·由·实际值·解决   类型[attribute],否则是元素的{type definition}   声明·解决·由...的实际值   substitutionGroup [attribute],如果存在,否则为ur-type   ·定义

所以在这种情况下,它是“ur-type definition·”,它只是xs:anyType的一个奇特名称(见§3.4.7),允许任何内容。

可悲的是,微软还没有更新他们的架构处理器大约15年,而且这样的错误并不为人所知。

这表明你有三种前进方式:

  • 向Microsoft提交错误并等待15年以获得解决方案

  • 切换到其他架构处理器(例如Saxon)

  • 通过声明元素Item所需的类型来解决错误。