Как получить значение из узла, используя LINQ to XML? - PullRequest
1 голос
/ 12 февраля 2011

У меня есть этот XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<aBase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <a>
    <a>
      <b>some data</b>
      <c>other data</c>
    </a>
    <a>
      <b>some data</b>
      <c>other data</c>
    </a>
  </a>
</aBase>

Я хочу получить все данные с <b> узлов, используя LINQ to XML. Я пробовал что-то вроде этого:

var query = from c in xmlData.Descendants("b")
            select c.Value;

но это не работает.

Как я могу это сделать? Кроме того, в чем разница между потомками, элементами и узлами?

Ответы [ 4 ]

2 голосов
/ 13 февраля 2011

xmlData.Descendants("b") даст вам коллекцию XElements с XName, равным «b». Затем вы можете перебрать эту коллекцию, чтобы получить каждое значение:

var data = xmlData.Descendants("b");
foreach (XElement b in data)
{
 string value = b.Value;
 // do something with value here
}

Descendants даст вам любой Элемент, который является потомком, не только прямые дети, но и дети их. Так что в вашем случае xmlData.Root.Descendants("b") вернет коллекцию для каждого элемента B в файле. Elements делает то же самое, но только для прямых потомков, а Nodes делает то же самое, но включает комментарии и текстовые узлы.

2 голосов
/ 13 февраля 2011

Вот, пожалуйста:

XDocument doc = XDocument.Parse(xml);

XNamespace ns = doc.Root.Name.Namespace;
var query = doc.Root.Elements(ns + "a").Elements(ns + "a").Elements().Select(el => el.Value);

Обратите внимание, что вам даже не нужен ни метод Descendants, ни итерация по потомкам. Elements без параметров возвращает прямых потомков, а метод Select извлекает значения потомков. И не забудьте про пространство имен xml или имена элементов не могут быть найдены. Без пространства имен вы пытаетесь извлечь разные элементы, а не элементы вашего XML.

Что касается различия между разными методами:

  1. Nodes() возвращает IEnumerable<XNode>
  2. Elements() возвращает IEnumerable<XElement>
  3. Descendants() возвращает все элементы-потомки (включая все глубоко вложенные элементы напротив Nodes и Elements, возвращают только дочерние элементы 1-го уровня вызывающего элемента.
2 голосов
/ 13 февраля 2011

Вы можете написать этот запрос, чтобы получить всю информацию от внутренних a узлов:

var query = from e in doc.Root.Elements( "a" ).Elements( "a" )
            select new { B = e.Element( "b" ).Value, C = e.Element( "c" ).Value };

Но это всего лишь запрос.Чтобы выполнить его и работать с результатами, напишите этот код:

foreach ( var e in query )
{
    // Do something with results... For example, write to console:
    Console.WriteLine( "B: " + e.B + ", C: " + e.C );
}

Узел - это один элемент дерева XML.Элемент aBase, все элементы a, b и c - узлы документа XML.

Элементы - это просто дочерние элементы выбранного узла (водин уровень иерархии).Например, для узла aBase единственным дочерним элементом является внешний элемент a, а не внутренний элемент a, b или c.

Потомки - этовсе элементы, которые являются дочерними или потомками текущего узла (на всех уровнях иерархии).Все элементы являются потомками элемента aBase, поскольку он является основным элементом документа.

0 голосов
/ 21 февраля 2012
var query = from c in xmlData.Descendants("b").First()
        select c.Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...