Чтение из файла SCXML с использованием LINQ

В настоящее время я работаю над проектом, в котором мне нужно извлечь состояния и соответствующие переходы из файла XML. В настоящее время я могу успешно извлечь всю правильную информацию, но вложенные переходы не связаны с их состояниями. Извиняюсь за странный файл XML, это было сделано быстро в качестве примера.

Это код, который у меня есть, который используется для извлечения информации из файла 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"

Спасибо за ваше время.

1 ответ

Обработка узлов за один проход.

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();
}
Другие вопросы по тегам