12

次の行に沿って、.NET で XPath を使用して XML ドキュメントを解析しています。

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

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

問題は、XPath Query forstuffChildが常に最初のstuff要素の子を返し、残りの要素を返さないことです。XPath を使用して個人に対してクエリを実行することはできませんXMLElementか?

4

4 に答える 4

10

//XPath 式の先頭は、ドキュメント ルートから始まります。「.//stuffChild」を試してみてください。. は、検索のコンテキストを設定する self::node() の省略形であり、// は子孫軸の省略形です。

だからあなたは持っています:

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

これは次のように変換されます。

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

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

子ノードが親と同じ名前を持つ可能性がある場合は、親を再選択しないように、次のやや冗長な構文を使用する必要があります。

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

また、「stuffChild」が「stuff」の直接の子孫である場合は、接頭辞を完全に省略して「stuffChild」のみを選択できます。

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

W3Schoolsチュートリアルには、理解しやすい形式で役立つ情報が含まれています。

于 2008-08-25T20:35:29.003 に答える
2

//に使用する は、ルートから始まる要素stuffChildを探していることを意味します。stuffChild

現在のノード (現在のノードの子孫) から開始する場合は、次のよう.//に を使用する必要があります。

stuff.SelectSingleNode(".//stuffChild");
于 2008-08-25T20:37:10.357 に答える
1

「stuffChild」が「stuff」の子ノードである場合、xpath は次のようになります。

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
于 2008-08-25T20:38:13.347 に答える
-1

単一のノードを選択すると、最初の要素のみが必要になります。したがって、最善の解決策は次のとおりです。

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");
于 2009-02-27T20:19:55.497 に答える