我有这个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;
但它不起作用。
我该怎么做? 此外,后代,元素和节点之间有什么区别?
答案 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
元素,所有a
,b
和c
元素 - XML文档的节点。
元素只是所选节点的子元素(在一个层次结构中)。例如,对于aBase
节点,唯一的子元素是外部a
元素,而不是内部a
,b
或c
元素。
后代是当前节点的子级或后代的所有元素(在所有级别的层次结构中)。所有元素都是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中的元素。
至于不同方法之间的区别:
Nodes()
返回IEnumerable<XNode>
Elements()
返回IEnumerable<XElement>
Descendants()
返回所有后代元素(包括与Nodes
相对的所有深层嵌套元素,而Elements
仅返回调用元素的第一级子元素。答案 3 :(得分:0)
var query = from c in xmlData.Descendants("b").First()
select c.Value;