0

私は初めて XML スキーマを作成していますが、それを作成するのに役立ついくつかの便利なツールを見つけました。

今、私は奇妙な状況にいます。私が書いたスキーマは、一部のツールでは有効ですが、他のツールでは有効ではありません。このスキーマは、「all」、「sequence」、および「group」を組み合わせたものです。ここに私のXMLスキーマがあります:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:group name="test">

        <xsd:all>
                <xsd:element name="e2" minOccurs="0" maxOccurs="1"/>
                <xsd:element name="e3" minOccurs="0" maxOccurs="1"/>
                <xsd:element name="e4" minOccurs="0" maxOccurs="1"/>
        </xsd:all>
    </xsd:group>

    <xsd:element name="e0">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="e1" maxOccurs="unbounded"/>
                <xsd:group ref="test"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

このスキーマは正しいですか? このバリデーターこれもうまくいきますが、Notepad++ の XML Tools プラグインは「スキーマ ファイルを解析できません」と表示します。

PS: このスキーマを書いたのは、e1、e2、e3、e4 を混在させる可能性がある要素 "e0" が必要だったからです。e2、e3、および e4 は 0 回または 1 回出現する必要があり、e1 は無制限に出現する可能性があります。たとえば、次の XML ファイルを渡す必要があります。

<e0>
   <e1/>
   <e1/>
   <e1/>
   <e1/>
   <e1/>
   <e2/>
</e0>

<e0>
   <e2/>
   <e3/>
   <e4/>
</e0>

<e0>
   <e1/>
   <e2/>
   <e3/>
   <e4/>
</e0>

これを行う別の方法を知っていますか?

ありがとう

4

1 に答える 1

5

あなたが持っているスキーマは、1.0 バージョンによると無効のようです

XML Schema stipulates that an all group must appear as the sole child at the top of a content model.

または、XML Schema Structures hereのセクション 3.8.6 を読んでみてください。あなたのリストに.NETのXSDプロセッサを追加します。あなたの場合、次のように文句を言います:

The group ref to 'all' is not the root particle, or it is being used as an extension.

XSD 1.0 では、e1 要素 (以下の e1s) のラッパーを作成しない限り、必要なものを適切に簡潔な構文で提供するソリューションはありません。

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:group name="test">
        <xsd:all>
            <xsd:element name="e1s" minOccurs="0">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="e1" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="e2" minOccurs="0"/>
            <xsd:element name="e3" minOccurs="0"/>
            <xsd:element name="e4" minOccurs="0"/>
        </xsd:all>
    </xsd:group>
    <xsd:element name="e0">
        <xsd:complexType>
            <xsd:group ref="test"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema> 

e1要素に関しては、e1sでラップする必要があります

<e0>
    <e1s>
        <e1/>
        <e1/>
        <e1/>
        <e1/>
        <e1/>
    </e1s>
    <e2/>
</e0>  

また

<e0>
    <e1s>
        <e1/>
    </e1s>
    <e2/>
    <e3/>
    <e4/>
</e0>     

その後、すべてが検証されます...

于 2012-05-30T00:38:20.230 に答える