2011-05-29 84 views
0

使用XLinq,您似乎必须知道元素的子元素的确切名称才能访问特定的子元素。我想访问/发现元素的直接子元素,但没有这种紧密耦合。只有XElement的子节点

如果我有:

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

在寻找 “根” 的孩子,root.Elements()COUNT()返回7 - 我想4( “1级” 节点)。如果我问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(); 
} 
+0

我想你没有发布你实际使用的XML:''只有4次。 – svick 2011-05-29 18:34:11

+0

您更新的XML无效,''未关闭。 – svick 2011-05-29 18:39:11

+0

序列'q3'确实只有4个元素。但是当你在带有子元素的元素上使用'ToString()'时,它会打印整个元素,包括子元素。如果你使用'ElementAt()',你会得到相同的行为。 – svick 2011-05-29 19:29:37

回答

1

在您发布的XML的情况下,有root.Elements()root.Elements("level1")之间没有差别:这两者返回相同的3个<level1>元素。

一般而言,XElement.Elements()完全符合您的要求:仅返回元素的直接子元素。

+0

对不起。新来此论坛,不得不学习需要添加>等。我确实得到了两个不同的值。在我使用的XML中,有4个子节点,我得到了所有14个后代。 – 2011-05-29 18:38:38

+0

@Llewellyn,然后发布您实际使用的XML,您的代码以及您期望的结果。此外,您不需要在这里使用HTML实体,只需输入您的代码,选择它,然后单击“{}”按钮。将其格式化为代码。 – svick 2011-05-29 18:41:20

+0

新手感谢您的帮助。 – 2011-05-29 19:07:12