首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ读取SCXML文件

使用LINQ读取SCXML文件
EN

Stack Overflow用户
提问于 2016-11-15 19:00:00
回答 1查看 163关注 0票数 0

我目前正在做一个项目,需要从XML文件中提取状态和相关的转换。目前,我可以成功地提取所有正确的信息,但嵌套的转换没有链接到它们的状态。对于这个奇怪的XML文件,很抱歉,它作为一个例子很快就被制作出来了。

这是我用来从XML文件中提取信息的代码

代码语言:javascript
复制
 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文件:

代码语言:javascript
复制
<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>

目前,我并不专注于能够创建状态机。我只需要能够为它提供正确格式化的信息。我已经做了两个独立的Descendant,因为搜索不能处理"state“搜索中的嵌套转换。我相当确定这是一个简单的修复方法,只需让foreach / for循环正确地打印值即可。

因此,理想情况下,每个状态的输出应如下所示,而不是首先列出所有状态,然后列出转换。

状态:"WaitForSelection“

转换:"Passed“,"Addto50PBox”

而不是

状态:"WaitForSelection“

状态:“已输入10便士”

转换:"Passed“,"Addto50PBox”

转换:"Passed“,"Addto10PBox”

谢谢您抽时间见我。

EN

回答 1

Stack Overflow用户

发布于 2016-11-15 20:11:56

单次处理节点。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40608138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档