web-dev-qa-db-ja.com

XSDによるXML検証:要素のシーケンスを気にしない方法

次のXSDコードがあります。

<xsd:complexType name="questions">
    <xsd:sequence>
        <xsd:element name="location" type="location"/>
        <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

ここでの問題は次のとおりです。要素の場所、multipleChoiceInputなどは、宣言されているのと同じ順序で出現する必要があります。これが発生したくはありません。検証プロセスでは、シーケンスは重要ではありません。どうすればこれを達成できますか?

私が試した別の可能性は次のとおりです:

<xsd:complexType name="questions">

        <xsd:choice maxOccurs="unbounded">   
            <xsd:element name="location" type="location"/>  
            <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
        </xsd:choice>            

</xsd:complexType>

この例では、シーケンスは本当に重要ではなくなり、必要な要素をいくつでも持つことができます(「すべて」では何ができないか)。しかし、私はまだmin-およびmaxOccursの問題を抱えています。この例では、「pictureInput」をできるだけ多く持つことができますが、これも0または1にしたい制約です。

助けてくれてありがとう!

37
jcborges
<xsd:complexType name="questions">
    <xsd:all>
        <xsd:element name="location" type="location"/>
        <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
        <xsd:element name="textInput" type="textInput"/>
        <xsd:element name="pictureInput" type="pictureInput"/>
    </xsd:all>
</xsd:complexType>

注:「シーケンス」を「すべて」に変更しました

シーケンスは順序を強制します(定義されているとおり)。順序が関係ない場合は、すべてが使用されます。

要素が複数回出現する可能性がある場合は、xsd:anyを使用できます。

<xsd:complexType name="questions">
    <xsd:sequence>
        <xsd:any minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

次のリンクでxsd:anyの詳細を確認できます。

https://www.w3schools.com/xml/schema_complex_any.asp

48
YoK

私はこの議論に少し遅れましたが、同じ問題があり、解決策を見つけました:

<xsd:complexType name="questions">
    <xsd:choice maxOccurs="unbounded">
        <xsd:element name="location" type="location"/>
        <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
        <xsd:element name="textInput" type="textInput"/>
        <xsd:element name="pictureInput" type="pictureInput"/>
    </xsd:choice>
</xsd:complexType>

重要なのは、xs:choiceとmaxOccurs = "unbounded"を組み合わせることです。 xs:allだけを使用する場合は、それぞれ1つずつのピリオドが許可されます。

追加のために編集:xs:anyは機能しますが、選択肢が項目化された4つの要素に制限されることはありません。それは何でも許可しますが、これはスキーマの目的をほとんど無効にします。

19
CD Jorgensen

ここのパーティーにも非常に遅れていますが、<xsd:all>minOccursおよびmaxOccursを併用しても機能しませんか?:

<xsd:complexType name="questions">
    <xsd:all>
        <xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
    </xsd:all>
</xsd:complexType>
1
gaelicyoda