質問
.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]");