XmlN"/>

关于.net:XPath和选择单个节点

关于.net:XPath和选择单个节点

XPath and Selecting a single node

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

1
2
3
4
5
6
XmlNodeList lotsOStuff = doc.SelectNodes("//stuff");

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

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


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

所以你有了:

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

转换为:

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

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

如果子节点的名称与父节点的名称相同,则您希望使用以下稍微冗长的语法,以确保不重新选择父节点:

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

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

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

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


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

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

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

如果" stuffChild"是" stuff"的子节点,则您的xpath应该只是:

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

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

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


推荐阅读