以以下XML为例:
<root>
<lines>
<line>
<number>1</number>
</line>
<line>
<number>2</number>
</line>
</lines>
</root>
XmlNodeList nodeList = doc.SelectNodes("//lines/line");
foreach(XmlNode node in nodeList)
{
int index = node.SelectSingleNode("//number");
}上述代码将为两个迭代生成index =1。
foreach(XmlNode node in nodeList)
{
int index = node.SelectSingleNode("number");
}上述代码将分别产生1,2。我知道xpath的第一次出现,但我觉得第一次出现应该是相对于节点本身。即使在从子节点中选择节点时,该行为似乎也会从根中找到第一次出现。这是微软想让它工作的方式,还是一个bug。
发布于 2016-02-19 07:48:31
是的,谢谢,但是在我的第二个例子中,去掉斜杠效果很好。
删除斜杠只有效,因为number是line的直接子元素。如果它在等级体系中更低:
<root>
<lines>
<line>
<other>
<number>1</number>
</other>
</line>
</lines>
</root>您仍然需要使用.//number。
我只是认为,如果您在节点中搜索节点,那么//将返回到整个文档,这是令人困惑的。
这正是设计XPath语法的方式。//表达式开头的XPath意味着计算上下文是文档节点-- XML的最外层节点。.//意味着路径表达式的上下文是当前上下文节点。
如果您仔细考虑一下,那么在任何上下文中从整个文档中进行选择实际上是很有用的。
这是微软想让它工作的方式,还是一个bug。
微软正在实现XPath标准,没错,这就是W3C打算让XPath库工作的方式,而它不是一个bug。
https://stackoverflow.com/questions/35493882
复制相似问题