2017-01-19 6 views
0

正しい構文を見つけるのに問題があります。C#Linq条件でXML値を取得

以下のコードが問題を私が言い表せるほど説明できないことを願っています。私は一致条件に基づいて匿名型を取得しようとしています。私は最初に属性の一致をチェックし、条件が満たされた場合にのみ値を返さなければなりません。要素に"value1"という名前の属性がある場合、同じ要素に"value"という属性の値が返されます。

矢印<---に問題がある場合の擬似コードを表示します。

事前にお手伝いいただける方に感謝します。

<item name="DataStore" > 
    <int name="item1" value="895"/> 
    <int name="item2" value="245"/> 
</item> 
<item name="DataStore" > 
    <int name="item1" value="540"/> 
    <int name="item2" value="97"/> 
</item> 


var result = from items in doc.Descendants() 
      where (string)items.Attribute("name") == "DataStore" 
      select new { 
       item1Value = items.Attribute("value").Value, <--- where items.Attribute("name") == "item1" ??? 
       item2Value = items.Attribute("value").Value <--- where items.Attribute("name") == "item2" ??? 
      } 

私はだから私は何かのように言いたい最後にresult.value1result.value2

を持っている「タプル」result返す必要がより明確にする:あなたがする必要がある

foreach (var item in result) { 
    Console.WriteLine(item.value1); //Prints 895 on first iteration 
    Console.WroteLine(item.value2); //Prints 245 on first iteration 
} 

答えて

2

DataStoreと一致する子アイテムをitemsから選択し、条件に基づいてフィルタリングします。

var xml = @"<root><item name=""DataStore"" > 
     <int name=""item1"" value=""895""/> 
     <int name=""item2"" value=""245""/> 
    </item> 
    <item name=""DataStore"" > 
     <int name=""item1"" value=""540""/> 
     <int name=""item2"" value=""97""/> 
    </item></root>"; 

var doc = XDocument.Parse(xml); 
var result = from items in doc.Descendants() 
      where (string)items.Attribute("name") == "DataStore" 
      select new 
      { 
       item1Value = (from d in items.Descendants() where d.Attributes("name").FirstOrDefault().Value.Equals("item1") select d.Attributes("value").FirstOrDefault().Value).FirstOrDefault(), 
       item2Value = (from d in items.Descendants() where d.Attributes("name").FirstOrDefault().Value.Equals("item2") select d.Attributes("value").FirstOrDefault().Value).FirstOrDefault() 
      }; 


foreach (var r in result) 
{ 
    Console.WriteLine($"Result {r.item1Value} {r.item2Value}"); 
} 
Console.ReadLine();