【问题标题】:Validating an XML file using XSD Schema files. (XML Structure)使用 XSD 架构文件验证 XML 文件。 (XML 结构)
【发布时间】:2012-06-04 20:53:51
【问题描述】:

对于这样的 XML 文档,

<Products>
    <productTypes>
        <productType name="BigOranges">
            <product>
                <name>BigOrange1</name>
                <quatity>25</quatity>
            </product>
            <product>
                <name>BigOrange2</name>
                <quatity>55</quatity>
            </product>
        </productType>
        <productType name="BigApples">
            <product>
                <name>BigApples1</name>
                <quatity>25</quatity>
            </product>
            <product>
                <name>BigApples2</name>
                <quatity>55</quatity>
            </product>
        </productType>
    </productTypes>
</Products>

我尝试自动生成 XSD 文件以查看示例,这就是生成的内容。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="T_quatity">
        <xs:restriction base="xs:byte">
            <xs:enumeration value="25"/>
            <xs:enumeration value="55"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="T_name">
        <xs:restriction base="xs:string">
            <xs:enumeration value="BigApples1"/>
            <xs:enumeration value="BigApples2"/>
            <xs:enumeration value="BigOrange1"/>
            <xs:enumeration value="BigOrange2"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="AT_1">
        <xs:restriction base="xs:string">
            <xs:enumeration value="BigApples"/>
            <xs:enumeration value="BigOranges"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="T_productTypes">
        <xs:sequence>
            <xs:element ref="productType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="T_productType">
        <xs:sequence>
            <xs:element ref="product" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute ref="name" use="required"/>
    </xs:complexType>
    <xs:complexType name="T_product">
        <xs:sequence>
            <xs:element ref="name"/>
            <xs:element ref="quatity"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="T_Products">
        <xs:sequence>
            <xs:element ref="productTypes"/>
        </xs:sequence>
    </xs:complexType>
    <xs:attribute name="name" type="AT_1"/>
    <xs:element name="quatity" type="T_quatity"/>
    <xs:element name="productTypes" type="T_productTypes"/>
    <xs:element name="productType" type="T_productType"/>
    <xs:element name="product" type="T_product"/>
    <xs:element name="name" type="T_name"/>
    <xs:element name="Products" type="T_Products"/>
</xs:schema>

查看上面的内容,我可以看到正在发生的事情是它们的类型已定义,然后在定义元素时使用这些类型。我不明白的是,元素是一个接一个地定义的,并且不遵循 XML 消息的结构。

如果此模式将用于验证 XML 文档,将如何验证 XML 文件的结构?比如使用上面的schema,它怎么知道productTypes元素是productType标签的内标签?

【问题讨论】:

    标签: xml parsing xsd schema


    【解决方案1】:

    您对问题的说明有点错误......应该是 它怎么知道 productTypes 元素是 productTypeProducts 的内部标签标签

    我认为让您感到困惑的是全局元素在 XSD 文件中的显示顺序,它与生成的 XSD 的创作风格有关,这种风格通常被称为“伊甸园”。

    应该注意,这些全局定义在 XSD 中的显示方式与兼容的 XML 实例之间没有任何关系。

    例如,如果您熟悉 UML 类图,那么类在可视化 UML 类图中的位置与该类在现实世界中的实际使用无关。

    p>

    作为补充,我现在可以从您的困惑中看出,如果尝试遵循 XML 结构,在伊甸园中学习 XSD ;) 可能会证明是一个糟糕的起点。

    下面是另一个生成的 XSD,它适用于相同的 XML;我想你可能会觉得这更直观(顺便说一句,这种创作风格因其深度嵌套的结构而被称为“俄罗斯娃娃”)。

    <?xml version="1.0" encoding="utf-8"?>
    <!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="Products">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="productTypes">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element maxOccurs="unbounded" name="productType">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element maxOccurs="unbounded" name="product">
                          <xsd:complexType>
                            <xsd:sequence>
                              <xsd:element name="name" type="xsd:string" />
                              <xsd:element name="quatity" type="xsd:unsignedByte" />
                            </xsd:sequence>
                          </xsd:complexType>
                        </xsd:element>
                      </xsd:sequence>
                      <xsd:attribute name="name" type="xsd:string" use="required" />
                    </xsd:complexType>
                  </xsd:element>
                </xsd:sequence>
              </xsd:complexType>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    

    我认为以上内容也强调并澄清了@Romil 在您的情况下的回答(他指的是 T_Products)。

    至于验证的工作原理,这并不容易解释。您可以将其视为一个状态机,其中状态之间的转换由您在 XSD 中放置的约束控制(最小/最大出现,顺序与选择与全部)。 XML 阅读器遍历 XML,并尝试从一个状态移动到另一个状态;当它到达一个没有出路的地方时,它可能是一个错误,或者成功验证,取决于......

    【讨论】:

    • 是的,上述格式对我​​来说比“伊甸园”方法更有意义。这两种方法中哪一种是最常用的方法,一种比另一种有什么缺点?
    • 在帖子中解释太多了...试试this link。在现实生活中,俄罗斯娃娃相当局限于学习(至少我在任何生产环境中都没有见过)。更令人困惑的是,还有两种风格,威尼斯盲和萨拉米切片;实际上,伊甸园是威尼斯人和意大利腊肠的结合。如果有的话,我主要看过威尼斯人和花园。对比分析请参考外部链接。
    【解决方案2】:

    xs:complexType 用于显示哪个对象将嵌套在这个父对象中。 xs:sequence 显示父对象中子对象的顺序。

    xs:simpleType 表示原子对象。

    【讨论】:

      猜你喜欢
      • 2014-01-22
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多