Prenez cet exemple XML:Comment filtrer les nœuds spécifiques de XML?
<root>
<grandParent GPid="1" hidden="false">
<parent Pid="1" hidden="false">
<child Cid="1" hidden="false"/>
<child Cid="2" hidden="true"/>
</parent>
<parent Pid="2" hidden="false">
<child Cid="3" hidden="false"/>
<child Cid="4" hidden="false"/>
</parent>
</grandParent>
<grandParent GPid="2" hidden="false">
<parent Pid="3" hidden="false">
<child Cid="5" hidden="true"/>
</parent>
<parent Pid="4" hidden="true">
<child Cid="6" hidden="false"/>
</parent>
</grandParent>
<grandParent GPid="3" hidden="true">
<parent Pid="5" hidden="false">
<child Cid="7" hidden="false"/>
</parent>
</grandParent>
</root>
je besoin d'une sorte de filtre pour obtenir une copie de celui-ci où tous les nœuds marqués « cachés » sont supprimés comme ceci:
<root>
<grandParent GPid="1" hidden="false">
<parent Pid="1" hidden="false">
<child Cid="1" hidden="false"/>
</parent>
<parent Pid="2" hidden="false">
<child Cid="3" hidden="false"/>
<child Cid="4" hidden="false"/>
</parent>
</grandParent>
<grandParent GPid="2" hidden="false">
<parent Pid="3" hidden="false"/>
</grandParent>
</root>
J'ai essayé d'utiliser quelque chose comme celui-ci
var newXML:XML = XML(root.([email protected] != "true").([email protected] != "true").([email protected] !=true);
Mais ce vraiment me donne tout juste le XML d'origine (depuis que je demande la racine où ces conditions sont remplies, je reçois la racine). Je comprends pourquoi mon approche ne fonctionne pas, mais je ne sais pas où aller à partir d'ici.
Je vois ce que vous faites ici. Une idée si la fonction récursive est plus ou moins efficace que les boucles de suppression dans ma réponse? – invertedSpear
La fonction récursive est environ 30 - 50 fois plus efficace. L'exécution de votre code 50 fois avec ceci comme le XML initial http://pastebin.com/f5f2e944d prend la moyenne de 110ms. La mienne prend 3ms en moyenne. – sberry
Vous pouvez améliorer la vitesse de votre code pour prendre environ 20ms en moyenne en inversant l'ordre de vos 3 pour chaque boucle (donc bouclez d'abord grandParent, puis parent, puis enfant). Si vous ne comprenez pas pourquoi cela augmente la vitesse faites le moi savoir et je peux expliquer. Bien sûr, l'augmentation relative dépend entièrement du nombre de nœuds grandParent et parent avec hidden = "true". Si aucun d'eux n'a caché = "true" alors votre code ne s'exécute pas plus rapidement en réorganisant votre pour chaque boucle. – sberry