如何使用LINQ to XML从节点获取值?

时间:2011-02-12 20:26:15

标签: c# linq-to-xml

我有这个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>

我想使用LINQ to XML从<b>个节点获取所有数据。 我尝试过这样的事情:

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

但它不起作用。

我该怎么做? 此外,后代,元素和节点之间有什么区别?

4 个答案:

答案 0 :(得分:2)

您可以编写此查询以从内部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元素,所有abc元素 - XML文档的节点。

元素只是所选节点的子元素(在一个层次结构中)。例如,对于aBase节点,唯一的子元素是外部a元素,而不是内部abc元素。

后代是当前节点的子级或后代的所有元素(在所有级别的层次结构中)。所有元素都是aBase元素的后代,因为它是文档的主要元素。

答案 1 :(得分:2)

xmlData.Descendants("b")将为您提供XName等于“b”的XElements集合。然后,您可以迭代此集合以获取每个值:

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执行相同的操作,但包含注释和textNodes。

答案 2 :(得分:2)

你走了:

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仅返回调用元素的第一级子元素。

答案 3 :(得分:0)

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