【问题标题】:XML verification using XSD is failing使用 XSD 的 XML 验证失败
【发布时间】:2017-08-10 23:38:15
【问题描述】:

我对通过 XmlSchemaSet 对象加载的简单 XSD 和使用 XmlReaderSettings 解析的 XML 有疑问

这是我的 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 行生成错误(“找不到属性‘名称’的架构信息。在第 5:11 行:

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

我的 XSD 出了什么问题?

【问题讨论】:

标签: c# xml xsd


【解决方案1】:

您需要为Item 元素定义架构。

【讨论】:

    【解决方案2】:

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

    以下内容应该在您的顶级项目下

                            <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>
    

    原来是这样的

    <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: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>
                              </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>
    

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

    【讨论】:

      【解决方案3】:

      我认为您的 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 中,其中说有效的 {type definition} 是:

      &lt;simpleType&gt;&lt;complexType&gt;对应的类型定义 [children] 中的元素信息项,如果有的话, 否则类型定义·解析·到的·实际值· 类型[属性],否则为元素的{类型定义} 声明·解决· 由…的·实际值· 替换组[属性],如果存在,否则为·ur-type 定义·。

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

      遗憾的是,微软已经有 15 年没有更新他们的架构处理器了,这样的错误并不为人所知。

      这表明您有 3 种前进方式:

      • 向 Microsoft 提交错误并等待 15 年得到解决

      • 切换到不同的模式处理器(例如 Saxon)

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

      【讨论】:

      • 感谢 Michael 的详尽解释。我会跳过选项 #1 :)
      猜你喜欢
      • 2019-06-23
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2021-03-09
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多