获得单个子元素的最佳方法

本文关键字:最佳 方法 元素 单个 | 更新日期: 2023-09-27 18:03:18

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

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

这工作得很好,但前几天我想知道它是否可以做得更干净,更容易与XPath或LINQ XML。我发现的大多数XPath示例似乎都想知道文档的整个结构,而我想要一个只知道父节点和子节点的通用函数。Linq to XML似乎更有前途,但我还没有找到匹配我正在寻找的示例。

获得单个子元素的最佳方法

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

XElement child = parent.Element(elementName);

如果有,则返回第一个元素,否则返回null。

考虑到您已经拥有的内容,您可以这样做:

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

XmlNode。如果不能使用XElement:

,则需要使用SelectSingleNode方法。
 var result = parentElement.SelectSingleNode(
      string.Format("*[local-name()='{0}']", nameWithoutPrefix));

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