2016-11-15 59 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> 

此刻,我不集中能够创建状态机。我只需要能够提供正确格式的信息。 我做了两个单独的后代,因为搜索无法应对“状态”搜索中的嵌套转换。我相当肯定这是一个简单的修复,只是得到一个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

非常感谢! –