古いシステムを書き直しており、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_>