XPath并选择单个节点

Fly*_*wat 11 .net xpath

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

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

foreach (XmlNode stuff in lotsOStuff) {
   XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild");
   // ... etc
}
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*org 10

//在XPath表达式的开头,从文档根开始.试试".//stuffChild"..self :: node()的简写,它将设置搜索的上下文,//是后代轴的简写.

所以你有了:

XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild");
Run Code Online (Sandbox Code Playgroud)

转换为:

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

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild");
Run Code Online (Sandbox Code Playgroud)

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

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");
Run Code Online (Sandbox Code Playgroud)

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

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
Run Code Online (Sandbox Code Playgroud)

W3Schools的教程有一个简单有用的信息消化格式.