如何使用XPathNavigator访问XML Child的索引?

时间:2010-12-10 17:55:29

标签: c# xml xpath xmldocument xpathnodeiterator

我想创建一个compilestring以将其与XPathExpression一起使用。我已经导航到一个子集并创建了一个迭代器。基于该迭代器的当前位置,我创建了一个新的currentNode。现在我想创建一个确切的表达式,并且只有那个节点,所以我可以创建一个只选择这些子节点的迭代器。

    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()是我不太喜欢的东西的占位符。我将我的表达式String放在This Page上的示例列表中 - “/ catalog / cd [1]选择目录的第一个cd子”

2 个答案:

答案 0 :(得分:0)

    string myXPathString = "/"+ nav.LocalName + "["+ HOWDOIGETTHISNUMBER() +"]"; 

您希望构建和评估此XPath表达式:

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

答案 1 :(得分:0)

评估XPathExpression的提示是正确的。可以找到各种表达式here。使用此查询解决了问题:

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