2009-08-24 5 views
0

Я просто изучаю Linq и придерживаюсь того, на что надеюсь, довольно просто. Мой XML-документ, как:Прочитать определенное значение элемента на основе определенного атрибута в Linq?

<?xml version="1.0" encoding="utf-8"?> 
<XDOC> 
    ... 
    <ItemsDetail> 
     <Item name="Item1"> 
      <data1> 
       <Data type="classA">55</Data> 
       <Data type="classB">66</Data> 
      </data1> 
      <data2> 
       <Data type="classA">77</Data> 
       <Data type="classB">88</Data> 
      </data2> 
     </Item> 
    </ItemsDetail> 
</XDOC> 

Так что я загрузить мой XML выше в XDocument типа, а затем запросить

var query = from p in ILSXml.Elements("XDOC").Elements("ItemsDetail").Elements("Item") 
      select p; 

Тогда я бегу foreach на на запросе.

foreach (var record in query) 
{ 
    Console.WriteLine("Name: {0}", record.Attribute("Name").Value); 
    Console.WriteLine("Data1 ClassA: {0}", record.Element("data1").Element("Data").Attribute("classA").Value); 
} 

Так линия:

Console.WriteLine("Data1 ClassA: {0}", record.Element("data1").Element("Data").Attribute("classA").Value); 

не работает, которая является то, что я был в значительной степени ожидал. Должен ли я запускать еще одну серию запросов или запускать встроенные анонимные методы?

О, пожалуйста, не комментируйте xml, это не мое, мне просто нужно работать с ним.

ответ

2

Я предполагаю, что вы пытаетесь получить значение 55? Вы можете использовать метод First, чтобы найти первый элемент «Данные» со значением атрибута «тип» класса «classA».

record.Element("data1") 
     .Elements("Data") 
     .First(data => data.Attribute("type").Value == "classA") 
     .Value 

Обратите внимание, что вышеупомянутое решение довольно хрупкое. Любое изменение структуры входного XML-документа может привести к исключению нулевой ссылки.

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

foreach (var record in ILSXml.XPathSelectElements("XDOC/ItemsDetail/Item")) 
{ 
    Console.WriteLine("Name: {0}", 
     record.Attribute("name").Value); 
    Console.WriteLine("Data1 ClassA: {0}", 
     record.XPathSelectElement("data1/Data[@type='classA']").Value); 
} 
+0

Это работает так же, как и сейчас, хотя и отсутствует. Первый. Есть ли более рекомендуемый способ работы с таким документом xml? –

+0

Если вы можете получить документ XSD (документ схемы XML), который описывает ваш документ, я бы определенно посмотрел на создание реальных классов и использование стандартной сериализации XML. –

Смежные вопросы