仅仅是XElement的子节点

时间:2011-05-29 18:22:04

标签: xml linq-to-xml xelement

使用XLinq,您似乎必须知道要访问特定子元素的元素子元素的确切名称。我希望在没有这种紧密耦合的情况下递归地访问/发现元素的直接子元素。

如果我有:

<根>
<级别1 />
<级别1 />
< 1级>
< level2.1>
< level2.2>
< level2.2.1 />
< /level2.2>
< / 1级>
<级别1 />
< /根>

在查找“root”的子节点时,root.Elements()。Count()返回7 - 我想要4(“level1”节点)。如果我问root.Elements(“level1”),我会得到4.但我必须知道子元素的名称。

问题:如何在不知道元素名称的情况下访问直系孩子?这将在XML树中的任何递归位置?

感谢。

---新添加:代码 --q1 == 7,q2 == 8和q3 == 4。 但是,如果你遍历q3的元素,你可以访问所有7个子节点而不是我想要的4个子节点。如果这意味着只需要一个ElementAt(#),那很好。但是这个对象似乎在它“看到”它的孩子之间存在冲突。

XElement xel = new XElement(
    new XElement("root",
        new XElement("level1"),
        new XElement("level1"),
        new XElement("level1",
                new XElement("level2.1"),
                new XElement("level2.2",
                    new XElement("level2.2.1"))),

                    new XElement("level1")
                    ));

var q1 = from x in xel.Descendants()
        select x;
var q2 = from x in xel.DescendantsAndSelf()
        select x;
var q3 = from x in xel.Elements()
        select x;

foreach (XElement x in q3.Elements())
{
    string s = x.ToString();
}

1 个答案:

答案 0 :(得分:1)

对于您发布的XML,root.Elements()root.Elements("level1")之间没有区别:两者都返回相同的3个<level1>元素。

通常,XElement.Elements()完全符合您的要求:只返回元素的直接子元素。