如何使用LINQ to XML获取特定嵌套XML元素的值
本文关键字:XML 嵌套 元素 获取 何使用 LINQ to | 更新日期: 2023-09-27 18:12:49
我有这样的XML
<Root>
<NodeA>
<NodeA1>
<NodeA11>
<SameNameNode>
<SameNameNodeChild1>Value 1</SameNameNodeChild1>
<SameNameNodeChild2>Value 2</SameNameNodeChild2>
</SameNameNode>
</NodeA11>
</NodeA1>
</NodeA>
<NodeB>
<SameNameNode>
<SameNameNodeChild1>Value 3</SameNameNodeChild1>
<SameNameNodeChild2>Value 4</SameNameNodeChild2>
</SameNameNode>
</NodeB>
<NodeC>
<NodeC1>
<SameNameNode>
<SameNameNodeChild1>Value 5</SameNameNodeChild1>
<SameNameNodeChild2>Value 6</SameNameNodeChild2>
</SameNameNode>
</NodeC1>
</NodeC>
</Root>
可以看到,"SameNameNode"及其子节点出现在不同嵌套级别的几个地方,但名称是相同的。我如何获得"值1"answers"值2"的元素值,仅使用LINQ到XML。谢谢你。
下面是一些获取值的完整示例代码:
public static void Main()
{
var xdoc = XDocument.Parse(@"
<Root>
<NodeA>
<NodeA1>
<NodeA11>
<SameNameNode>
<SameNameNodeChild1>Value 1</SameNameNodeChild1>
<SameNameNodeChild2>Value 2</SameNameNodeChild2>
</SameNameNode>
</NodeA11>
</NodeA1>
</NodeA>
<NodeB>
<SameNameNode>
<SameNameNodeChild1>Value 3</SameNameNodeChild1>
<SameNameNodeChild2>Value 4</SameNameNodeChild2>
</SameNameNode>
</NodeB>
<NodeC>
<NodeC1>
<SameNameNode>
<SameNameNodeChild1>Value 5</SameNameNodeChild1>
<SameNameNodeChild2>Value 6</SameNameNodeChild2>
</SameNameNode>
</NodeC1>
</NodeC>
</Root>");
var results = xdoc.Root
.Elements("NodeA")
.Elements("NodeA1")
.Elements("NodeA11")
.Elements("SameNameNode")
.Descendants()
.Select(e => new { ElementName = e.Name, ElementValue = e.Value });
foreach (var result in results)
Console.WriteLine("Name = {0}, Value = {1}", result.ElementName, result.ElementValue);
}
这将输出:
Name = SameNameNodeChild1, Value = Value 1
Name = SameNameNodeChild2, Value = Value 2
您可能需要调整查询——我假设您想要"SameNameNode"的所有后代,但是您可能只希望过滤某些子元素。
@Mun,回答你关于LINQ查询语法的问题,你可以用这段代码做同样的事情。这两段代码是等价的:
var results = from nodeAElem in xdoc.Root.Elements("NodeA")
from nodeA1Elem in nodeAElem.Elements("NodeA1")
from nodeA11Elem in nodeA1Elem.Elements("NodeA11")
from sameNameNodeElem in nodeA11Elem.Elements("SameNameNode").Descendants()
select new { ElementName = sameNameNodeElem.Name, ElementValue = sameNameNodeElem.Value };