2010-12-10 3 views
0

Le code j'utilise est:Mon InnerXml est égal à mon OuterXml après avoir sélectionné seulement les ChildNodes avec XPathNodeIterator

string m_myXML = "<parent>\n" + 
       " <child1>\n"+ 
       " <child2a>\n"+ 
       "  <list1 attrib=\"one\" />\n"+ 
       "  <list2 attrib=\"two\" />\n"+ 
       " </child2a>\n"+ 
       " <child2b>\n"+ 
       "  <list1 attrib=\"one\" />\n"+ 
       "  <list2 attrib=\"two\" />\n"+ 
       " </child2b>\n"+ 
       " </child1>\n"+ 
       "</parent>"; 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(m_myXML); 
XPathNavigator nav = doc.CreateNavigator(); 
XPathExpression expr; 
expr = nav.Compile("/*/*"); //Select all children of top level parents 
XPathNodeIterator iterator = nav.Select(expr); 

Le résultat est que iterator.Current.InnerXml est le même que iterator.Current.OuterXml et c'est Identique à l'original m_myXML. Quand je déplace l'itérateur vers le suivant via iterator.MoveNext(), il pointe vers le premier enfant1 - ce que j'attendrais exactement au début.

Est-ce que je fais quelque chose de mal? Existe-t-il une bonne et détaillée explication pour dummys là-bas comment System.Xml est censé fonctionner?

+2

Bien la documentation http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnodeiterator.aspx indique clairement: "Un objet XPathNodeIterator retourné par la classe XPathNavigator n'est pas positionné sur le premier noeud dans un ensemble sélectionné de noeuds Un appel à la méthode MoveNext de la classe XPathNodeIterator doit être effectué pour positionner l'objet XPathNodeIterator sur le premier noeud de l'ensemble de noeuds sélectionné. ". Donc, je ne suis pas sûr pourquoi vous attendez que l'itérateur soit dans un état significatif sans appeler MoveNext ou en utilisant for-each. –

+1

@MartinHonnen - vous devriez mettre cela comme la réponse, pas comme un commentaire! –

Répondre

0

Comme Martin Honnen souligné: Une bonne source est msdn/system.xml... « Un objet XPathNodeIterator renvoyé par la classe XPathNavigator n'a pas été positionné sur le premier noeud dans un ensemble de noeuds sélectionné Un appel à la méthode MoveNext de la classe XPathNodeIterator doit être. fait pour positionner l'objet XPathNodeIterator sur le premier nœud de l'ensemble de nœuds sélectionné. "

Cela est logique Perfekt maintenant - parce que sinon vous auriez du mal à parcourir la liste en utilisant quelque chose comme ceci:

while (iterator.MoveNext()) 
{ 
    //Do Stuff 
} 

Merci Martin Honnen pour votre réponse dans la section commentaire - i totalement raté le point cette classe.

Questions connexes