1

いくつかのタイプの複数の要素を含む xml ドキュメントからスキーマを作成していますが、シリアル化してから逆シリアル化すると維持する必要があるランダムな順序になっています (私は VB.NET でプログラミングしていますが、C# の回答は問題ないので、言語は指定していません)。

<xml version="1.0" encoding="utf-8">
<sample:ABC>
   <sample:DEF></sample:DEF>
   <sample:XYZ></sample:XYZ>
   <sample:DEF></sample:DEF>
   <sample:PNQ></sample:PNQ>
   <sample:DEF></sample:DEF>
   <sample:DEF></sample:DEF>
</sample:ABC>

これまでのところ、xsd.exe によって作成された次のスキーマがあります。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="ABC">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="DEF" minOccurs="0" />
        <xs:element name="XYZ" minOccurs="0" />
        <xs:element name="PNQ" minOccurs="0" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

ただし、これは xml が入ってくる可能性のあるすべての方法と一致するわけではありません。明らかに、xml とスキーマを大幅に単純化し、問題を簡単に説明できるように 1 つのサンプルのみを示しました。

この要素を使用するという提案を見てきましたallが、それは各子の 1 つしか許可しません。また、重複する子要素 (たとえば 2 つの DEF 要素) を追加しようとしましたが、「あいまいな」スキーマが作成されます。また、一連の選択要素を使用してみましたが、スキーマから生成されたコードはオブジェクトを使用する必要があるため、タイプ セーフではありません。これを解決するために継承を使用することは可能かもしれないと思いますが、私のスキーマ スキルではそれができません。

問題は、xml に正しく一致させるために使用できるスキーマ要素があるかどうかです。そうでない場合、少なくともxmlの有効性をチェックするために使用できるスキーマを作成できますか?

4

1 に答える 1

3

DEFXYZおよび要素の任意のシーケンスをPNQ任意の順序および任意の数で一致させるには、次を使用できます。

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="test" 
  targetNamespace="test" 
  elementFormDefault="qualified">
  <xs:element name="ABC">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="DEF" minOccurs="0" />
        <xs:element name="XYZ" minOccurs="0" />
        <xs:element name="PNQ" minOccurs="0" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

スキーマとの唯一の違いは、 for の追加maxOccurs="unbounded"ですxs:sequence

ただし、このような XML は .NET クラスの標準的な逆シリアル化を使用して逆シリアル化できないことに注意してください。同じ名前の要素はリストまたは配列に逆シリアル化され、連続している必要があります。

このようなケースは、カスタム デシリアライゼーションを使用して処理できます。ここここを参照してください。

于 2013-03-07T21:18:47.810 に答える