我们有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似乎更有前景,但我没有找到匹配我正在寻找的示例。
答案 0 :(得分:6)
LINQ to XML使非常变得容易 - 您只需使用XContainer.Element
方法:
XElement child = parent.Element(elementName);
如果有的话,这将给你第一个元素,否则为null。
答案 1 :(得分:1)
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;
}