質問

.NET で XPath を使用して、次のような XML ドキュメントを解析しています。

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

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

問題は、XPath クエリが stuffChild 常に最初の子を返します stuff 要素であって、残りは決してありません。XPath を個人に対するクエリに使用することはできませんか XMLElement?

役に立ちましたか?

解決

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

したがって、次のようになります。

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

これは次のようになります。

xmlNode スタッフチャイルド = スタッフ.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");

W3スクール チュートリアルには、わかりやすい形式で役立つ情報が含まれています。

他のヒント

// の前で使用します stuffChild あなたが探していることを意味します stuffChild ルートから始まる要素。

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

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

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

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

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

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top