使用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'元素不是文档的最终根源。
有什么想法吗?
答案 0 :(得分:3)
您可以使用Linq查询一次性选择所有'c'
元素:
XDocument doc = XDocument.Load("<yourxml/>");
var c_elements = doc.Descendants("a")
.Descendants("b")
.Descendants("c);
现在从提取属性或选择任何子节点做任何你想做的事。
答案 1 :(得分:2)
使用linq; - )
您想要使用Descendants方法而不是Elements方法。像这样:
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"));