访问嵌套的子节点
本文关键字:子节点 嵌套 访问 | 更新日期: 2023-09-27 18:35:10
在使用xmltextreader一段时间后,发现"使用linq"几乎是这里每个.NET xml相关问题的答案,我决定试一试,到目前为止它真的很好,但是我正在使用的文档有点奇怪,所以现在我遇到了一点问题。
我正在使用的内容的简化版本;
<a>
<b name="..." id=".">
<c id="..." type="...">
<value_I_want>.....</value_I_want>
</c>
<c id="..." type="...">
<value_I_want>.....</value_I_want>
</c>
我需要查询"a"来获取"c"的每个实例的属性和元素 - 我无法查询"b",因为它不是唯一的,并且会返回一堆不相关的东西。
我可能应该提到,"a"元素不是文档的最终根源。
有什么想法吗?
您可以使用
Linq 查询一次选择所有'c'
元素:
XDocument doc = XDocument.Load("<yourxml/>");
var c_elements = doc.Descendants("a")
.Descendants("b")
.Descendants("c);
现在,通过提取属性或选择任何子节点来执行任何操作。
使用 linq ;-)
您希望使用"后代"方法,而不是"元素"方法。 像这样:
var xdoc = XDocument.Load("<yourxml/>");
var celes = xdoc.Descendants("a").Descendants("c");
这将首先找到所有元素"a",然后在该集合中查找所有元素"c"。 这可能是您想要的,也可能不是您想要的。 为了确保您有正确的父母身份,您可以这样做:
var xdoc = XDocument.Load("<yourxml/>");
var celes = xdoc.Descendants("c")
.Where(x => (x.Parent != null) && (x.Parent.Name == "b"))
.Where(x => (x.Parent.Parent != null) && (x.Parent.Parent.Name == "a"));