0

在使用 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'元素不是文档的最终根。

有任何想法吗?

4

2 回答 2

4

'c'您可以使用 Linq 查询一次选择所有元素:

XDocument doc = XDocument.Load("<yourxml/>"); 
var c_elements = doc.Descendants("a")
                    .Descendants("b")
                    .Descendants("c);

现在从提取属性或选择任何子节点中做任何你想做的事情。

于 2013-10-12T19:34:07.803 回答
3

使用 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"));
于 2013-10-12T19:44:55.880 回答