C # - Выберите потомков XML с Linq - PullRequest
       26

C # - Выберите потомков XML с Linq

8 голосов
/ 17 сентября 2009

У меня есть следующая структура XML:

<row>
  <field name="Id">1</field>
  <field name="AreaId">1</field>
  <field name="Name">ת&quot;א</field>
</row>
<row>
  <field name="Id">2</field>
  <field name="AreaId">4</field>
  <field name="Name">אבטליון</field>
</row>

Я хочу перебрать узлы name с помощью Linq. Я попробовал это:

var items = (from i in doc.Descendants("row")
                     select new
                     {
                         Text = i.Value

                     }).ToList();

Но это не сработало так, как мне нужно. Есть предложения?

Ответы [ 3 ]

15 голосов
/ 17 сентября 2009
var items = doc.Descendants("field")
               .Where(node => (string)node.Attribute("name") == "Name")
               .Select(node => node.Value.ToString())
               .ToList();
11 голосов
/ 17 сентября 2009

Прежде всего, убедитесь, что ваш XML имеет единственный корневой узел:

<rows>
<row>
  <field name="Id">1</field>
  <field name="AreaId">1</field>
  <field name="Name">ת&quot;א</field>
</row>
<row>
  <field name="Id">2</field>
  <field name="AreaId">4</field>
  <field name="Name">אבטליון</field>
</row>
</rows>

После этого вы можете использовать следующий код для загрузки xml:

string xml = //Get your XML here    
XElement xElement = XElement.Parse(xml);
//This now holds the set of all elements named field
var items = 
       xElement
      .Descendants("field")
      .Where(n => (string)n.Attribute("name") == "Name");
1 голос
/ 06 августа 2010

Я думаю, что Linq к Sql - самый прямой подход:

var items = (from c in doc.Descendants("field")
            where c.Attribute("name").Value == "Name"
            select c.Value
            ).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...