2011-05-29 90 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