1

对于一个看起来像这样的 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 文件的结构?例如使用上述模式,它如何知道 productTypes 元素是 productType 标签的内部标签?

4

2 回答 2

2

您对问题的说明有点错误...应该是它如何知道 productTypes 元素是productType Products标签的内部标签

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

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

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

作为补充,我现在可以从您的困惑中看出,如果尝试遵循 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,并尝试从一个状态移动到另一个状态;当它到达一个没有出路的地方时,它可能是一个错误,或者成功的验证,取决于......

于 2012-05-30T16:51:41.440 回答
1

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

xs:simpleType 表示这是原子对象。

于 2012-05-30T15:30:13.470 回答