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要素がproductTypeProductsタグの内部タグであることをどのようにして知るのかということです。

混乱しているのは、グローバル要素がXSDファイルに表示される順序であり、生成されたXSDのオーサリングスタイル(通常は「エデンの園」と呼ばれるスタイル)に関係していると思います。

これらのグローバル定義がXSDに表示される方法と、準拠するXMLインスタンスとの間に関係がないことに注意してください。

例として、UMLクラス図に精通している場合、視覚的なUMLクラス図内のクラスの位置が、実世界でのクラスの実際の使用と同じように関係ありません。

補足として、あなたの混乱から、エデンの園でXSDを学ぶことは、XML構造に従おうとすると、悪い出発点になる可能性があることがわかります。

以下は、同じXMLで機能する別の生成されたXSDです。これはもっと直感的にわかると思います(ところで、このオーサリングスタイルは、深くネストされた構造のため、「ロシアンドール」と呼ばれています)。

<?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 に答える