2010-12-10 38 views
2

我想創建一個編譯字符串來與XPathExpression一起使用它。我已經導航到一個子集並創建了一個迭代器。基於該迭代器的當前位置,我創建一個新的currentNode。現在我想要創建一個確切的表達式,只有那個節點,所以我可以創建一個只選擇這些子元素的迭代器。如何使用XPathNavigator訪問XML子項的索引?

public XPathNodeIterator extractSubChildIterator(XPathNavigator currentNode) 
    { 
     XPathNavigator nav = currentNode.Clone(); 
     string myXPathString = "/"+ nav.LocalName + "["+ HOWDOIGETTHISNUMBER(nav) +"]"; 
     while (nav.MoveToParent()) 
     { 
      if (!(nav.Name == "")) 
       myXPathString = "/" + nav.LocalName + "[" + HOWDOIGETTHISNUMBER(nav) + "]" + myXPathString; 
     } 
     myXPathString += "/*"; 

     XPathExpression expr = nav.Compile(myXPathString); 
     return currentNode.Select(expr); 
    } 

函數HOWDOIGETTHISNUMBER()是我沒有完全得到的東西的佔位符。我立足於This Page在examplelist我表達字符串 - 「/目錄/ CD [1]選擇目錄的第一張CD的孩子」

+0

好問題,+1。查看我的答案獲得簡單的解決方案。 :) – 2010-12-10 18:28:16

回答

0

評估XPathExpression的提示是正確的。各種表達式可以找到here。使用此查詢解決問題:

private string HOWDOIGETTHISNUMBER(XPathNavigator theNode) 
    { 
     XPathExpression query = theNode.Compile("count(preceding-sibling::"+theNode.LocalName+")+1"); 
     return theNode.Evaluate(query).ToString(); 
    } 
0
string myXPathString = "/"+ nav.LocalName + "["+ HOWDOIGETTHISNUMBER() +"]"; 

你想構造並評估該XPath表達式:

"count(preceding-sibling::*[name()=''" + nav.LocalName +"]"