0

我们有 C# 代码来遍历我们创建的各种 XML 文档。通常我们需要获取一个已知的子元素(它可以是唯一的子元素,也可以是其他兄弟元素)。我有一个给定父元素的函数,子名称将返回子元素:

public static XmlElement GetChildElement(XmlElement parentElement, string childName) 
{
    return parentElement.GetElementsByTagName(childName).Cast<XmlElement>().FirstOrDefault();
}

这很好用,但前几天我想知道是否可以使用 XPath 或 LINQ to XML 更简洁、更轻松地完成它。我发现的大多数 XPath 示例似乎都想知道文档的整个结构,并且我想要一个只知道父项和子项的通用函数。Linq to XML 似乎更有希望,但我还没有找到与我正在寻找的匹配的示例。

4

3 回答 3

6

那么 LINQ to XML 使这非常容易 - 您只需使用以下XContainer.Element方法:

XElement child = parent.Element(elementName);

如果有任何元素,这将为您提供第一个元素,否则为 null。

于 2013-03-11T20:03:51.743 回答
1

XmlNode.SelectSingleNode是您在无法使用 XElement 时寻找的方法:

 var result = parentElement.SelectSingleNode(
      string.Format("*[local-name()='{0}']", nameWithoutPrefix));

请注意,我的示例使用名称空间作弊(接受任何名称),您应该了解在您的情况下是否需要正确支持名称空间。

于 2013-03-11T20:14:27.650 回答
1

鉴于您已经拥有的,您可以这样做:

public static XmlElement GetChildElement(XmlElement parentElement, string childName) 
{
    return parentElement[childName];
}

这将返回第一个匹配的子元素,如果没有,则返回 null。哎呀,我不确定为此使用便捷方法是否有意义,但是如果您已经引用了此方法,则上述修改将起作用。

这里要注意的一点是,您提供的代码不会返回第一个匹配的元素;它返回第一个匹配的后代元素。如果这实际上是你想要的,你可以这样做:

public static XmlElement GetChildElement(XmlElement parentElement, string childName) 
{
    return parentElement.SelectSingleNode("//" + childName) as XmlElement;
}
于 2013-03-11T20:14:45.327 回答