2010-12-10 46 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 +"]"