C# と .Net 4.0 では、再帰的な XSD スキーマがあります。その XSD に基づく XML は、XmlSerializer で適切にシリアル化されます。また、エラーなしで逆シリアル化しますが、すべての要素を取得することはありません。
以下は XSD の抜粋です。
<xs:complexType name="SettingGroup">
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Notes" type="xs:string" minOccurs="0" />
<xs:element name="SettingGroup" type="SettingGroup" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Setting" type="Setting" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
タイプ SettingGroup には、0 個以上の SettingGroup 要素と、Setting という名前の別のタイプの 0 個以上の要素が再帰的に含まれることに注意してください。SettingGroup に SettingGroups のみが含まれている場合や、Settings のみが含まれている場合にうまく機能します。ただし、SettingGroup に SettingGroups と Settings の両方がある場合、期待どおりにシリアル化されますが、逆シリアル化すると、すべての設定要素が失われます。
ref も使用してみましたが、同様の結果が得られました。
<xs:element ref="SettingGroup" minOccurs="0" maxOccurs="unbounded" />
手動で .xsd ファイルを作成し、xsd.exe を使用して C# クラスを作成しました。
役に立つかもしれない場合のために、設定の定義は次のとおりです。
<xs:complexType name="Setting">
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Notes" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="Roam" type="xs:boolean" minOccurs="0" default="true" />
<!--<xs:element name="RoamConditions" type="RoamConditions" />-->
<xs:element name="SettingLocation" type="SettingLocation" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
逆シリアル化ですべての要素を取得できない理由についての提案をいただければ幸いです。