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

时间:2013-03-11 19:59:21

标签: c# xml xpath linq-to-xml

我们有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似乎更有前景,但我没有找到匹配我正在寻找的示例。

3 个答案:

答案 0 :(得分:6)

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

XElement child = parent.Element(elementName);

如果有的话,这将给你第一个元素,否则为null。

答案 1 :(得分:1)

如果您不能使用XElement,

XmlNode.SelectSingleNode是您要查找的方法:

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

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

答案 2 :(得分: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;
}