12

我在 .NET 中使用 XPath 来解析 XML 文档,大致如下:

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

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

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

4

4 回答 4

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教程以易于理解的格式提供了有用的信息。

于 2008-08-25T20:35:29.003 回答
2

//你在前面使用的意思stuffChild是你正在寻找stuffChild元素,从根开始。

如果你想从当前节点(当前节点的后代)开始,你应该使用.//,如:

stuff.SelectSingleNode(".//stuffChild");
于 2008-08-25T20:37:10.357 回答
1

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

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
于 2008-08-25T20:38:13.347 回答
-1

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

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");
于 2009-02-27T20:19:55.497 回答