2016-11-15 7 views
0

現在、プロジェクトに取り組んでおり、XMLファイルから状態と関連する遷移を抽出する必要があります。現在、すべての正しい情報を抽出できますが、ネストされた遷移は状態にリンクされていません。奇妙なXMLファイルのおかげで、すぐに例として作られました。LINQを使用したSCXMLファイルからの読み込み

これは、XMLファイルから情報を抽出するために使用され、私が持っているコード

以下
using System; 
using System.Linq; 
using System.Xml.Linq; 

namespace LINQTesting 
{ 
    internal class Program 
{ 
    private static void Main(string[] args) 

    { 

    var xdoc = XDocument.Load(@"C:/ProjectC/XmlConverterTest.xml"); 
    xdoc.Descendants("state").Select(a => new 
     { 
      id = a.Attribute("id").Value 

     }).ToList().ForEach 
     (a => 
     { 
      Console.WriteLine("Node Name: " + a.id); 

     }); 



    xdoc.Descendants("transition").Select(d => new 
    { 
     action = d.Attribute("event").Value, 
     target = d.Attribute("target").Value 
    }).ToList().ForEach 
     (d => 
     { 
      Console.WriteLine("Action Name: " + d.action); 
      Console.WriteLine("Target: " + d.target); 
     }); 

    } 
    } 
} 

ですが、私のXMLファイルです:

<statemachine> 

<state id="WaitForSelection"> 
    <transition event="Passed" target="AddTo50pBox"/> 
</state> 

<state id="10p Entered" subworkflow="ValidateCoin"> 
    <transition event="Passed" target="AddTo10pBox"/> 
</state> 

<state id="20p Entered" subworkflow="ValidateCoin"> 
    <transition event="Passed" target="AddTo20pBox"/> 
    <transition event="Failed" target="NESTED transition"/> 
</state> 

<state id="50p Entered" subworkflow="ValidateCoin"> 
    <transition event="Passed" target="AddTo50pBox"/> 
</state> 

<state id="RejectCoin"> 
    <transition event="CoinRejected" target="DispenseCoin"/> 
</state> 

<state id="End State"> 
    <transition event="CoinRejected" target="RejectCoin"/> 
</state> 

</statemachine> 

瞬間、私は、集束ないですステートマシンを作成することができます。私はちょうど正しくフォーマットされた情報を提供する必要があります。 「州」検索内のネストされた遷移に対処できないため、2つの別々の子孫を作成しました。私はこれが単純な修正だと確信しています。ちょうどforeach/forループが正しく値を出力するようになっています。

理想的には、すべての状態を最初にリストし、その後に遷移を表示するのではなく、出力を各状態について以下のように読むことが理想的です。

州: "WaitForSelection"

トランジション: "合格"、 "Addto50PBox"

代わり

州の "WaitForSelection"

状態:

を "10Pは、入力しました"

トランジション:「合格」、「Addto50PBox」

トランジション:「合格」、「Addto10PBox」

ありがとうございました。

答えて

0

ノードをシングルパスで処理します。

foreach (var state in xdoc.Descendants("state")) 
{ 
    Console.WriteLine("State: " + state.Attribute("id").Value); 
    foreach (var transition in state.Elements("transition")) 
    { 
     Console.WriteLine("Transitions: " + transition.Attribute("event").Value 
      + " " + transition.Attribute("target").Value); 
    } 
    Console.WriteLine(); 
} 
+0

ありがとうございました! –

関連する問題