1

古いシステムを書き直しており、xsd.exe を使用して XML ドキュメントからスキーマを作成し、xsd.exe/xsd2code を使用して xsd から .NET コードを生成しました。ただし、おそらく元のxmlドキュメントの設計または生成方法に欠陥があるようですが、問題を修正するためのスキーマについて十分に知りません。問題を説明するクリーンアップされたサンプルを次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="ABC">
    <xs:complexType>
      <xs:all>
        <xs:element ref="ABC_HEADER"/>
        <xs:element name="BODY_A" minOccurs="0" />
        <xs:element name="BODY_B" minOccurs="0" />
        <xs:element name="BODY_C" minOccurs="0" />
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>

ABC クラスは、さまざまなタイプのヘッダーと単一の body 要素を含むメッセージです (これは私が設計したものではありません)。生成されたクラスがシリアル化されると、出力 XML で各本体クラスの 1 つを取得します。

<?xml version="1.0" encoding="utf-8"?>
<ABC>
  <ABC_HEADER>
  </ABC_HEADER>
  <BODY_A></BODY_A>
  <BODY_B></BODY_B>
  <BODY_C></BODY_C>

設計を変更することはできず、生成された XML がレガシー XML と一致する必要があることを考えると、<xs:all>これを表現する正しい方法を選択するか、それとも <xs:sequence>または他の何かがより良い選択でしょうか?

または、正しい出力を生成するカスタム (事前) シリアル化コードを記述する必要がありますか?

編集:最終的には良い答えが得られたにもかかわらず、要素のカスタムシリアライゼーションコードを作成する必要がありましたが、および要素<ABC>の通常のシリアライゼーション(xml宣言を削除)と組み合わせる必要がありました<ABC_HEADER><BODY_>

4

2 に答える 2

3

これを試しましたか?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                                    elementFormDefault="qualified">
  <xs:element name="ABC_HEADER" type="xs:string"/>
  <xs:element name="ABC">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="ABC_HEADER"/>
        <xs:choice>
          <xs:element name="BODY_A"/>
          <xs:element name="BODY_B"/>
          <xs:element name="BODY_C"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

編集:次のような継承スキーマを試しましたか:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="ABC">
    <xs:sequence>
      <xs:element ref="ABC_HEADER" />
      <xs:element name="BODY" type="BODY" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="BODY">
    <xs:sequence />
  </xs:complexType>

  <xs:complexType name="BODY_A">
    <xs:complexContent mixed="false">
      <xs:extension base="BODY">
        <!-- define BODY_A schema here -->
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="BODY_B">
    <xs:complexContent mixed="false">
      <xs:extension base="BODY">
        <!-- define BODY_B schema here -->
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="BODY_C">
    <xs:complexContent mixed="false">
      <xs:extension base="BODY">
        <!-- define BODY_C schema here -->
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

</xs:schema>
于 2012-09-18T13:30:36.653 に答える
0

BODY_ABODY_B、およびの順序が要素をBODY_C使用するよりも重要な場合は、sequence要素を使用できますallsequenceただし、要素を使用したいようです。

all 要素は、子要素が任意の順序で出現できること、および各子要素が 0 回または 1 回出現する可能性があることを指定します。

ソース

sequence 要素は、子要素が順番に現れる必要があることを指定します。各子要素は、0 から任意の回数発生できます。

ソース

minOccurs="0"インジケータも引き続き使用します。

完全なスキーマ リファレンス

于 2012-09-18T14:37:25.310 に答える