2010-02-11 5 views
0

avoir un fichier xml comme ceci.Ma fonction récursive ne fonctionne pas correctement

<?xml version ="1.0" encoding ="utf-8"?> 
    <menu> 
      <menuNode title="Register" value="true"> 
      <menuNode title="Company" value="false"> 
       <menuNode title="Add" value="false" /> 
       <menuNode title="Modify" value="false" /> 
       <menuNode title="Delete" value="false" /> 
      </menuNode> 
      <menuNode title="SubCategory" value="true"> 
       <menuNode title="Add" value="false" /> 
       <menuNode title="Modify" value="false" /> 
       <menuNode title="Delete" value="false" /> 
      </menuNode> 
      <menuNode> 
    </menu> 

Je veux supprimer tous les nœuds avec valeur = false j'ai écrit une fonction récursive comme celui-ci, mais sa ne fonctionne pas prooperly.

Public Sub RemoveValueFalseNodes(ByVal MyMenuSource As XElement) 
     For Each myMenuNode In MyMenuSource.Elements 
      If myMenuNode.Elements.Count > 0 Then 
       RemoveValueFalseNodes(myMenuNode) 
      End If 
      If myMenuNode.Attribute("value").Value = "false" Then 
       myMenuNode.Remove() 
      End If 
     Next 
    End Sub 
+1

Ne me ressemble pas à un fichier XML valide. – Shoban

+0

À droite, fermez la dernière balise "menuNode". – AndiDog

Répondre

1

Vous ne devriez jamais modifier une collection pendant que vous l'énumérez. Généralement, il lance une exception lorsque vous essayez, mais parfois il ne fait que visser les résultats. Au lieu de cela, vous devriez envisager de faire quelque chose comme ce qui suit (désolé pour le C#, mais je ne sais pas vraiment VB.NET LINQ)

var nodes = from x in MyMenuSource.Descendants("menuNode") 
      where !(bool)x.Attribute("value") 
      select x; 

foreach (var node in nodes.ToArray()) { 
    node.Remove(); 
} 

Les deux choses à noter à propos de ce qui précède - J'utilise les descendants() méthode pour éviter d'avoir à faire une plongée récursive de l'arbre XML. Aussi je transforme la collection en un tableau qui prend un "instantané" des résultats de sorte que la suppression d'un élément ne perturbe pas la structure XML tant que la requête est toujours active.

+0

Merci beaucoup –

0

Ne retirez jamais un élément d'une matrice en l'itérant ou prenez les mesures appropriées. Dans ce cas, vous devez simplement parcourir MyMenuSource.Elements de l'arrière vers l'avant, donc la suppression d'un élément ne provoque pas de problème lors de votre prochaine itération.

Questions connexes