【问题标题】:Extracting XElement children and grandchildren by name按名称提取 XElement 子孙
【发布时间】:2011-08-01 16:36:27
【问题描述】:

我有一个 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);
}

我了解上述方法不起作用,但只是想有效地展示我想要实现的目标。

感谢任何反馈。

谢谢, 贾斯汀

【问题讨论】:

  • 我认为您可能需要的只是后代,但我仍然不清楚您想要什么样的结果。也许模拟小的输入和输出样本。

标签: c# xml xelement


【解决方案1】:

虽然我通常不愿意建议使用 XPath,但这可能是这里最合适的方法,使用 XPathSelectElement:

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

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

【讨论】:

  • 打败我 :)。出于好奇,为什么您通常不愿意推荐 XPath?也许只是因为我有厚重的 XSLT 背景,但我发现它是一种选择元素的简洁方式。
  • @James:在 C# 中,我认为它是“数据中的代码”——比“真实代码”调用方法等更难使用。此外,使用命名空间更容易当您使用代码而不是使用 XPath 时,在 LINQ to XML 中。 XPath 在它的位置上很好,但是当我可以使用 LINQ to XML 中的直接方法时,我倾向于这样做:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多