1

Xml ファイルはこちら.

次の 2 つのループは、本質的に同じことを行っているにもかかわらず、異なる出力を返します。

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

2 つの XPath 式は、「本質的に同じこと」を行いません。

XPath仕様によると:

ロケーション パス//para[1](...)は、親paraの最初の子であるすべての子孫要素を選択します。para

同様に、XPath 式(すぐにEddie//*[heads!=1][3]/nameを生成する必要がある 3 番目の反復を参照)は、「親の 3 番目の子であり、頭の数が 1 とは異なる」すべての子孫要素の子を選択します。name

つまり、親ノード内で3指定されたヘッド数の制限を満たす子のセットを指します。

代わりに、次を試してください。/descendant::*[heads!=1][{0}]/name

于 2013-01-28T14:26:46.203 に答える