2010-10-16 6 views
1

J'ai un fichier XML chargé dans un objet XMLDocument. J'Itère le document à l'aide d'unXPATH ne renvoyant aucun résultat

For Each node As XmlNode In doc.GetElementsByTagName("Item", [NAMESPACE]) 
    'Do Stuff 
Next 

Je voudrais utiliser XPath dans ce boucle pour tirer tous les noeuds avec le nom de « myNode » je l'aurais pensé que j'aurais tout simplement faire le noeud. SelectNodes ("MyNode"), mais cela retourne une liste de zéro.

<Root> 
<Item> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<RandomOtherNode></RandomOtherNode> 
<RandomOtherNode></RandomOtherNode> 
</Item> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<RandomOtherNode></RandomOtherNode> 
<RandomOtherNode></RandomOtherNode> 
<Item> 
</Item> 
<Item> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<RandomOtherNode></RandomOtherNode> 
<RandomOtherNode></RandomOtherNode> 

</Item> 
</Root> 

Est-ce que je dois faire quelque chose en plus?

+0

"retourner une liste de zéros"? Peux-tu élaborer? – Les

+0

Une liste avec un nombre de zéro. – Ben

Répondre

2

Une XPATH de" MyNode "devrait fonctionner, je suppose que votre [NAMESPACE] est faux. Essayez d'appeler GetElementsByTagName() sans NAMESPACE. Soit cela, ou regardez le code dans votre boucle et assurez-vous que vous n'avez pas un WriteLine() malformé ou quelque chose.

Veuillez excuser l'exemple C# suivant car j'utilise rarement VB. Il démontre que votre XPATH est correct ...

string xml = @" 
<Root> 
    <Item> 
     <MyNode></MyNode> 
     <MyNode></MyNode> 
     <MyNode></MyNode> 
     <RandomOtherNode></RandomOtherNode> 
     <RandomOtherNode></RandomOtherNode> 
    </Item> 
    <MyNode></MyNode> 
    <MyNode></MyNode> 
    <MyNode></MyNode> 
    <RandomOtherNode></RandomOtherNode> 
    <RandomOtherNode></RandomOtherNode> 
    <Item> 
    </Item> 
    <Item> 
     <MyNode></MyNode> 
     <MyNode></MyNode> 
     <MyNode></MyNode> 
     <RandomOtherNode></RandomOtherNode> 
     <RandomOtherNode></RandomOtherNode> 

    </Item> 
</Root> 
"; 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xml); 
     foreach (XmlNode node in doc.GetElementsByTagName("Item")) 
     { 
      foreach (XmlNode n2 in node.SelectNodes("MyNode")) 
       Console.WriteLine("{0}:{1}", node.Name, n2.Name); 
     } 
1

Pour tous myNode vous pouvez utiliser doc.DocumentElement.SelectNodes ("//") myNode ou mieux encore doc.DocumentElement.SelectNodes ("/ Root/article/myNode")

+0

// MyNode obtiendra tous les éléments MyNode dans le document, même si le noeud courant (pour node.SelectNodes ("// MyNode")) est un "Item". Par exemple, en utilisant // MyNode retournera 9 nœuds, alors que l'OP en recherche six. – Les

+0

Mon mauvais, n'a pas vu le "MyNode" en dehors du nœud "Item". Utilisez le chemin complet du nœud ... – florin

0

Try « // MyNode ", ou" descendant :: MyNode "

+0

Voir mon commentaire sur // MyNode ci-dessus. "descendant :: MyNode" fonctionnerait. – Les

Questions connexes