按名称提取XElement子孙

时间:2011-08-01 16:36:28

标签: c# xml xelement

我有一个XElement(myParent),其中包含我希望从中提取数据的多个级别的子级。感兴趣的元素位于父母的已知位置。

我知道我能够通过以下方式获得子元素:

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);
}

我知道上面的方法不起作用,只是想有效地展示我想要实现的目标。

感谢任何反馈。

谢谢你, 贾斯汀

2 个答案:

答案 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)
    {
        // ...
    }
}

答案 1 :(得分: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