1

次のようなスキーマがあります。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Leaf" />
  <xs:complexType name = "Leaf" mixed="true">
         <xs:attribute name="ID" type="xs:string" />
  </xs:complexType>

  <xs:element name="Frame" />
  <xs:complexType name="Frame" mixed="true">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Leaf" type ="Leaf" nillable="true"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame" nillable="true"/>
    </xs:sequence>
       <xs:attribute name="ID" type="xs:string" />
  </xs:complexType>

  <xs:element name="Document">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" name="Version" type="xs:string" />
        <xs:element minOccurs="0" maxOccurs="1" name="MetaData1" type="xs:string" />
        <xs:element minOccurs="0" maxOccurs="1" name="MetaData2" type="xs:string" />

        <xs:element minOccurs="1" maxOccurs="unbounded" name="Page" nillable="false">
          <xs:complexType mixed="true">
            <xs:sequence>
              <xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

基本的に再帰的な構造です。ドキュメントには、ページのリストを含めることができます。少なくとも 1 ページが含まれている必要があります。ページは、フレームのリストで構成されます。フレームには、サブフレームまたはリーフを含めることができます (つまり、サブフレームを含めることはできません)。MetaData1 と MetaData2 はオプションであり、どこにでも使用できます。

サンプル XML は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<Document>
  <Version>1.1</Version>
  <MetaData1>Somemetadata</MetaData1>
  <Page>Page1
       <Frame ID="1">Frame1
          <Frame ID="2">SubFrame1
                <Frame ID="3">SubFrame2
                      <Leaf ID="1">Alone</Leaf>
                </Frame>
               <Leaf ID="2">Alone2</Leaf>
          </Frame>
        </Frame>
        <Frame ID="3">SubFrame3
        </Frame>
 </Page>
 <MetaData2 />
</Document>

XmlReaderSettings と XmlSchemaSet を使用して、スキーマに対して XML 検証を行っています。何らかの理由で、次の 2 つのエラーが発生します。

1) {"要素 'Document' には無効な子要素 'Metadata2' があります。予想される可能な要素のリスト: 'Page'."}

私の場合、これらの要素は任意の順序で表示されるのに対し、順番に読み取っているためだと思います。xs:all 属性を実行しようとしましたが、maxoccurs=unbounded では機能しません。その他の方法で ?

2) {"要素 'Frame' には無効な子要素 'Leaf' があります。予想される可能な要素のリスト: 'Frame'."}

これは (1) と同じでしょうか? リーフID=2でエラー発生

どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

1

Microsoft .NET を使用しているため、XSD 1.0 が提供できるものに制限されています。xs:allコンポジターは、 を持つパーティクルのみをサポートしmaxOccurs="1"ます。それがあなたの最初の問題です。

あなたのスキーマは、その事実を確実に捉えておらず、どこでも発生する可能性がMetaData1あります。、そしてそれらの要素をまったく持っていません。だからあなたはそれについて何かをしなければならないでしょう。MetaData2LeafFramePage

とにかく、説明したように、まさにあなたが望むものを達成することはできません。何かを与えなければなりません。いくつかの要素の位置を指定したり、特定の粒子間の変動を許可したり、繰り返し要素を「コレクション」アイテムの下に「隠したり」することを選択できます。ページにはページ、フレームにはフレーム、リーフにはリーフ。

メタデータ要素とバージョンに指定した定義を考慮して、「同等の」ADO.NET DataSet (XSD 1.0 で可能であったと仮定) に影響を与えない別のオプションを強く検討します。代わりに属性を使用します。このアプローチについて説明します。他のオプションについてご不明な点がございましたら、お知らせください。さらに例を追加します。

変更された XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:complexType name = "Leaf" mixed="true">
        <xs:attribute name="ID" type="xs:string"/>
        <xs:attributeGroup ref="metadata"/>
    </xs:complexType>

    <xs:complexType name="Frame" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Leaf" type ="Leaf" nillable="true"/>
            <xs:element name="Frame" type="Frame" nillable="true"/>
        </xs:choice>
        <xs:attribute name="ID" type="xs:string"/>
        <xs:attributeGroup ref="metadata"/>
    </xs:complexType>

    <xs:element name="Document">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="1" maxOccurs="unbounded" name="Page" nillable="false">
                    <xs:complexType mixed="true">
                        <xs:sequence>
                            <xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame"/>
                        </xs:sequence>
                        <xs:attributeGroup ref="metadata"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="version" type="xs:string" use="required"/>
            <xs:attributeGroup ref="metadata"/>
        </xs:complexType>
    </xs:element>

    <xs:attributeGroup name="metadata">
        <xs:attribute name="metadata1" type="xs:string"/>
        <xs:attribute name="metadata2" type="xs:string"/>
    </xs:attributeGroup>
</xs:schema>

上記の視覚化:

XSD ダイアグラムを示す QT​​Assistant

同等の ADO.NET DataSet (これは、モデルの説明を確認するのに最も使いやすいものです):

XSD を ADO.NET DataSet として表示する QTAssistant

上記を検証する意味的に同等の XML (最小限の変更で、代わりに属性を使用した場合の影響を簡単に確認できます):

<?xml version="1.0" encoding="UTF-8"?>
<Document version="1.1" metadata1="Somemetadata" metadata2="">
    <Page>Page1
        <Frame ID="1">Frame1
            <Frame ID="2">SubFrame1
                <Frame ID="3">SubFrame2
                    <Leaf ID="1">Alone</Leaf>
                </Frame>
            </Frame>
        </Frame>
        <Frame ID="3">SubFrame3
        </Frame>
    </Page>
</Document>

上記の XML の図:

サンプル XML

有効なインスタンスを示すより複雑なサンプル XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" version="version1" metadata1="metadata11" metadata2="metadata21">
    <Page metadata1="metadata11" metadata2="metadata21">text<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
            <Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
            <Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                <Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                <Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                    <Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                </Frame>
                <Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                    <Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                </Frame>
            </Frame>
            <Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                <Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                <Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                    <Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                </Frame>
                <Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                    <Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
                </Frame>
            </Frame>
        </Frame>
    </Page>
    <Page metadata1="metadata11" metadata2="metadata21">text<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
            <Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
        </Frame>
    </Page>
</Document>
于 2012-09-19T05:03:14.533 に答える