2017-01-19 4 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, который имеет result.value1 и result.value2

Таким образом, в конце концов, я хочу сказать, что-то вроде:

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

ответ

2

Вам нужно выберите дочерние элементы из items, которые вы нашли, что соответствует DataStore и отфильтровывайте их по вашим критериям.

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(); 
Смежные вопросы