1

xml 文件在这里

以下两个循环给出不同的输出,尽管它们本质上做的是相同的事情:

XPathNavigator nav = xmlDoc.CreateNavigator();
foreach (object v in (XPathNodeIterator)nav.Evaluate(@"//*[heads!=1]/name"))
{
    Console.Out.WriteLine(v);
}

for (int i = 1; i <= 3; i++)
{   
    Console.Out.Write(i);
    Console.Out.WriteLine(nav.Evaluate(string.Format("string(//*[heads!=1][{0}]/name)", i)));
}

输出:

Zaphod
Frankie and Benji
Eddie
1Zaphod
2Frankie and Benji
3

为什么“Eddie”在 for 循环的末尾丢失了?

4

1 回答 1

1

这两个 XPath 表达式不做“本质上相同的事情”:

根据XPath 规范

位置路径(...) 选择作为其父元素的第一个子元素的//para[1]所有后代元素。parapara

类似地,XPath 表达式//*[heads!=1][3]/name(查看应该立即产生Eddie的第 3 次迭代)选择所有后代元素的name孩子,这些后代元素是“其父项的数量不为 1 的第三个孩子”。

即,3指的是在其父节点内满足指定数量限制的子节点

相反,请尝试:/descendant::*[heads!=1][{0}]/name

于 2013-01-28T14:26:46.203 回答