2011-08-01 65 views
0

我有一個XElement(myParent),其中包含我希望從中提取數據的多個子級。感興趣的元素在父母的已知位置。按名稱提取XElement兒童和孫子女

我明白,我能夠通過獲得一個子元素:

myParent.Element(childName); 

myParent.Element(level1).Element(childName); 

我有麻煩搞清楚如何通過一個數組做到這一點,如果我想循環對於處於不同級別的元素列表,以及循環遍歷列表。例如,我有興趣獲得以下元素集:

myParent.Element("FieldOutputs").Element("Capacity"); 
myParent.Element("EngOutputs").Element("Performance") 
myParent.Element("EngOutputs").Element("Unit").Element("Efficiency") 

如何在數組中定義這些位置以便我可以簡單地遍歷數組?

string[] myStringArray = {"FieldOutputs.Capacity", "EngOutputs.Performance", "EngOutputs.Unit.Efficiency"}; 

for (int i=0; i< myArray.Count(); i++) 
{ 
    XElement myElement = myParent.Element(myStringArray); 
} 

我明白,上面的方法不起作用,只是想表明有效什麼,我想要的目的。

任何反饋意見。

謝謝 賈斯汀

+0

我認爲所有你可能需要的是後人,但我仍然不清楚是什麼樣的你想要的結果。也許模擬小的輸入和輸出樣本。 –

回答

6

雖然通常我不願意使用XPath表明,它可能是最合適的方法在這裏,使用XPathSelectElement

string[] paths = { "FieldOutputs/Capacity", "EngOutputs/Performance", 
        "EngOutputs/Unit/Efficiency"}; 

foreach (string path in paths) 
{ 
    XElement element = parent.XPathSelectElement(path); 
    if (element != null) 
    { 
     // ... 
    } 
} 
+0

打我吧:)。出於好奇,爲什麼你通常不願意推薦XPath?也許只是因爲我有一個沉重的XSLT背景,但我覺得它是選擇元素的簡潔方式。 –

+0

@James:在C#中,我認爲它是「數據內的代碼」 - 與「真正的代碼」調用方法等相比,它更難以使用。另外,使用LINQ to XML命名空間更容易,重新使用代碼而不是使用XPath。 XPath沒問題,但是當我可以使用LINQ to XML中的直接方法代替時,我傾向於這樣做:) –

0

Descendants()方法是你要尋找的,我相信。例如:

var descendants = myParent.Descendants(); 
foreach (var e in descendants) { 
    ... 
} 

http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.descendants.aspx

編輯:

你的問題更仔細地看,它看起來像你可能想使用XPathSelectElements()

var descendants = myParent.XPathSelectElements("./FieldOutputs/Capacity | ./EngOutputs/Performance | ./EngOutputs/Units/Efficency"); 

http://msdn.microsoft.com/en-us/library/bb351355.aspx