2010-12-10 49 views
2

Je veux créer une chaîne de compilation pour l'utiliser avec une XPathExpression. J'ai déjà navigué vers un sous-ensemble et j'ai créé un itérateur. Basé sur la position actuelle de cet itérateur, je crée un nouveau currentNode. Maintenant je veux créer l'expression exacte qui mène à cela, et seulement ce noeud, ainsi je peux alors créer un itérateur qui sélectionne seulement ces enfants.Comment puis-je accéder à l'index d'un enfant XML à l'aide d'un XPathNavigator?

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); 
    } 

La fonction HOWDOIGETTHISNUMBER() est l'espace réservé pour la chose que je DonT très bien compris. Je base mon expression chaîne sur la examplelist sur This Page - "/ catalogue/cd [1] sélectionne le premier enfant cd du catalogue"

+0

Bonne question, +1. Voyez ma réponse pour une solution simple. :) –

Répondre

0

L'astuce pour évaluer une XPathExpression était la bonne. Des expressions diverses peuvent être trouvées here. Le problème a été résolu en utilisant cette requête:

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() +"]"; 

Vous voulez construire et évaluer cette expression XPath:

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