XPath并选择单个节点

时间:2008-08-25 20:32:36

标签: .net xpath

我在.NET中使用XPath来解析XML文档,类似于:

XmlNodeList lotsOStuff = doc.SelectNodes("//stuff");

foreach (XmlNode stuff in lotsOStuff) {
   XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild");
   // ... etc
}

问题是stuffChild的XPath查询总是返回第一个stuff元素的子元素,而不是其余元素。 XPath不能用于查询个人XMLElement吗?

4 个答案:

答案 0 :(得分:10)

XPath表达式开头的

//从文档根开始。试试“.//stuffChild”。 。 self :: node()的简写,它将设置搜索的上下文,//是后代轴的简写。

所以你有:

XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild");

转换为:

xmlNode stuffChild = stuff.SelectSingleNode(“self :: node()/ descendant :: stuffChild”);

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild");

如果子节点可以与父节点具有相同的名称,您可能希望使用后面稍微详细的语法,以确保不重新选择父节点:

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");

另请注意,如果“stuffChild”是“stuff”的直接后代,则可以完全省略前缀,只需选择“stuffChild”。

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");

W3Schools教程以易于理解的格式提供有用的信息。

答案 1 :(得分:2)

您在//前面使用的stuffChild表示您正在从根开始查找stuffChild元素。

如果要从当前节点(当前节点的后代)开始,则应使用.//,如下所示:

stuff.SelectSingleNode(".//stuffChild");

答案 2 :(得分:1)

如果“stuffChild”是“stuff”的子节点,那么你的xpath应该是:

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");

答案 3 :(得分:-1)

选择单个节点意味着您只需要第一个元素。所以,最好的解决方案是:

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");