XML を使用可能なオブジェクト グラフに逆シリアル化しようとしています。私たちのシステムでオブジェクト構造を生成できるツールができるようになるまでにはしばらく時間がかかるので、できるだけ人間が XML を書き込めるようにしたいと考えています。
私が探しているのは、このような XML です
<RuleSet>
<Conditions>
<AttributeEqualTo>
<Id>C1</Id>
<AttributeName>Foo</AttributeName>
<ExpectedValue>Bar</ExpectedValue>
</AttributeEqualTo>
<AttributeNotEqualTo>
<Id>C2</Id>
<AttributeName>Blah</AttributeName>
<ExpectedValue>Value</ExpectedValue>
</AttributeNotEqualTo>
</Conditions>
<States>
<State>
<Id>Start</Id>
<Transitions>
<Transition>
<Condition>C1</Condition>
<State>S1</State>
</Transition>
<Transition>
<Condition>C2</Condition>
<State>S2</State>
</Transition>
</Transitions>
</State>
<State>
<Id>S1</Id>
<Transitions>
<Transition>
<Condition>C2</Condition>
<State>S2</State>
</Transition>
</Transitions>
</State>
<State>
<Id>S2</Id>
</State>
</States>
</RuleSet>
私が探しているのは、Enumerable of Conditions と Enumerble of States を持つ RuleSet オブジェクトを含むオブジェクト グラフです。各状態には、以前に定義された条件、RuleSet の条件、および別の状態で作成された Enumerable の遷移があります。
独自のカスタム パーサーを作成する代わりに、誰かが既に作成した C# の XML パーサーを使用して、これを行う簡単な方法はありますか?
最初の回答から、もう少し明確にする必要があると思います。重複を減らすために参照を維持する設定をオンにして、オブジェクト グラフの単純なバージョンをシリアル化しようとしたとき。私は以下を受け取りました:
<RuleSet z:Id="1" >
<Conditions z:Id="2" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:anyType z:Id="3" i:type="b:AttributeEqualTo" >
<b:AttributeName z:Id="4">Foo</b:AttributeName>
<b:ExpectedValue z:Id="5" i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Bar</b:ExpectedValue>
<b:Id z:Id="6">C1</b:Id>
</a:anyType>
<a:anyType z:Id="7" i:type="b:AttributeEqualTo" >
<b:AttributeName z:Ref="5" i:nil="true"/>
<b:ExpectedValue z:Ref="4" i:nil="true"/>
<b:Id z:Id="8">C2</b:Id>
</a:anyType>
</Conditions>
<States z:Id="9" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:anyType z:Id="10" i:type="b:State" >
<b:EntryActions z:Id="11"/>
<b:Id z:Id="12">S1</b:Id>
<b:Transitions z:Id="13" z:Size="2">
<a:anyType z:Id="14" i:type="c:Transition" >
<c:Condition z:Ref="3" i:nil="true"/>
<c:Next z:Id="15" i:type="b:State">
<b:EntryActions z:Id="16"/>
<b:Id z:Id="17">S2</b:Id>
<b:Transitions z:Id="18" z:Size="1">
<a:anyType z:Id="19" i:type="c:Transition">
<c:Condition z:Ref="7" i:nil="true"/>
<c:Next z:Id="20" i:type="b:State">
<b:EntryActions z:Id="21"/>
<b:Id z:Id="22">S3</b:Id>
<b:Transitions z:Id="23" z:Size="0"/>
</c:Next>
</a:anyType>
</b:Transitions>
</c:Next>
</a:anyType>
<a:anyType z:Id="24" i:type="c:Transition" >
<c:Condition z:Ref="7" i:nil="true"/>
<c:Next z:Ref="20" i:nil="true"/>
</a:anyType>
</b:Transitions>
</a:anyType>
<a:anyType z:Ref="15" i:nil="true"/>
<a:anyType z:Ref="20" i:nil="true"/>
</States>
</RuleSet>
私がやろうとしているのは、 z:Id="x" と z:Ref="x" を独自の Id プロパティの使用法に置き換えることです。繰り返しますが、システムをより人間が書き込み可能にするためです。C# クラスで属性を設定して、タグの名前を変更する方法がわかります。