特定のノードの先祖を調べようとしています。これを「NodeA」と呼びましょう。「NodeA」ノードのリストを取得し、その祖先を検索して特定の属性値を確認したいと考えています。すべての「NodeA」ノードを取得するコードは次のとおりです。
String xPathExpression = "//*[local-name()='NodeA']";
XPathNodeIterator nodeSet = (XPathNodeIterator)navigator.Evaluate(xPathExpression);
foreach (XPathNavigator item in nodeSet)
{
// Iterate through ancestors in here.
}
「// ここで祖先を反復処理」領域では、式を使用してノードを評価し、次の方法で祖先のリストを取得できます (「NodeA」ごとに)。
XPathNavigator item;
var ancestorExpression = string.Format("//*[name()='{0}']/ancestor-or-self::*", item.Name);
XPathNodeIterator ancestors = (XPathNodeIterator)navigator.Evaluate(ancestorExpression);
ただし、これは冗長に思えます。元の xml と XPathNavigator インスタンスがあるため、ナビゲーターを介して式を評価することなく、その時点で先祖を取得することはできませんか? 次のようなもの ( item は XPathNavigator 型です):
item.GetAncestors();
また
Helper.GetAncestors(fullXML, item)
アイテムに SelectAncestors メソッドがあることに気付きましたが、それを機能させることができませんでした。しかし、それがそれである場合、例は大歓迎です
<NodeAGrandDaddy>
<NodeADaddy>
<NodeA>
<NodeA/>
<NodeADaddy/>
<NodeAGrandDaddy/>