4

データを含む属性とタグの組み合わせを使用するXMLファイルがあります。

XMLファイルの構造を制御することはできませんが、現在、これを解析するためにLINQを調べ、この構造にアプローチする最善の方法について意見があるかどうか疑問に思っています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE call_flow SYSTEM "../../../../dtds/Callflow_1-1.dtd">
<call_flow version="1.1" serial="13903" first_element="Element1">
  <element_def name="Element1">
    <voice class="com.classname.Name">
      <static>Element1.xml</static>
    </voice>
    <exit_state name="done">
      <next_element>Element2</next_element>
    </exit_state>
  </element_def>
  <element_def name="Element2">
    <voice class="com.classname.Name2">
      <static>Element2.xml</static>
    </voice>
    <exit_state name="option1">
      <next_element>Element3</next_element>
    </exit_state>
    <exit_state name="option2">
      <next_element>Element4</next_element>
    </exit_state>
  </element_def>
  <element_def name="Element3">
    <voice class="com.classname.Name3">
      <static>Element3.xml</static>
    </voice>
    <exit_state name="done">
      <next_element>Element4</next_element>
    </exit_state>
  </element_def>
  <element_def name="Element4">
    <decision>
      <class src="com.classname.Name4"/>
    </decision>
    <exit_state name="0">
      <next_element>Element3</next_element>
    </exit_state>
    <exit_state name="1">
      <next_element>Element5</next_element>
    </exit_state>
  </element_def>
  <element_def name="Element5">
    <voice class="com.classname.Name5">
      <static>element5.xml</static>
    </voice>
  </element_def>
</call_flow>

LINQコードのサンプルをたくさん見つけることができますが、Next_Elementとelement_def"name"プロパティの両方の値を取得する方法が実際にはわかりません。

誰かが助けてくれて、私を正しい方向に向けてくれるなら、私はそれをいただければ幸いです。

4

2 に答える 2

3
XDocument xdoc = XDocument.Load(path_to_xml);
var query = from ed in xdoc.Descendants("element_def")
            select new
            {
               Name = (string)ed.Attribute("name"),
               NextElements = ed.Elements("exit_state")
                                .Select(es => (string)es.Element("next_element"))
            };

このクエリは、名前Nameを含むプロパティと次の要素の名前を含む匿名オブジェクトのシーケンスを返します。element_defIEnumerable<string>

于 2012-12-09T00:01:57.667 に答える
0

これはどうですか:

var doc =  XDocument.Load("myXml.xml");
var list = doc.Descendants("element_def")
              .Select(x => new
              {
                 elDefName = x.Attribute("name").Value,
                 nextEl = x.Descendants("next_element").Select(y=> y.Value).ToList()
              });

IEnumerable匿名オブジェクトのを返します。ここで、はelement_defノードelDefNameのname属性の値であり、可能なnext_element値のリストが含まれます。nextEl

于 2012-12-09T00:19:26.487 に答える