J'utilise PHP DOMDocument et les classes connexes pour travailler avec XML. Le XML contient des instructions de traitement qui doivent être traitées dans un ordre spécifique, de haut en bas, le plus profond à le moins profond.PHP: Processus récursif puis supprimer DOMElements de DOMDocument
J'utilise une fonction récursive qui prend l'ensemble du document DOMDocument, puis appelle lui-même le nœud enfant foreach
, tout en bas.
J'ai besoin de supprimer certains de ces nœuds enfants après les avoir traités. Le problème est que dès qu'un nœud enfant est supprimé, il semble que le foreach
est "hors de contrôle" et je ne peux plus supprimer de nœuds enfants.
Exemple XML doc:
<root id="1">
<instruction id="2">
<inner id="3"/>
</instruction>
<instruction id="4">
<inner id="5"/>
</instruction>
</root>
je dois traiter inner[@id=3]
d'abord, puis supprimez-le. Ensuite, je dois traiter instruction[id=2]
et le supprimer. Jusqu'à ici, tout va bien.
Ensuite, je dois traiter inner[@id=5]
et le supprimer. Je peux le lire/le traiter correctement, mais lorsque j'essaie de l'enlever:
$parentNode=$inner->parentNode;
$parentNode->removeChild($inner);
Rien ne se passe. Il semble que la suppression du premier nœud d'instruction a rendu PHP confus au sujet des éléments qui sont contenus dans le document maintenant.
Je sais qu'il est possible de traiter le XML de bas en haut et de supprimer tous les nœuds dans cet ordre, mais j'ai besoin d'aller de haut en bas.
Un autre élément d'information ici - J'ajoute aussi de nouveaux nœuds au document pendant le traitement, au cas où cela changerait mes options.
Que dois-je faire pour que cela fonctionne?
Vous avez absolument raison, Marc. J'envisage également de mettre un drapeau sur les éléments traités afin de pouvoir recharger tout le document après avoir supprimé un élément. Le rechargement réinitialiserait tous les tableaux. Le drapeau me permettrait d'ignorer les éléments traités et de commencer par où je me suis arrêté. – Tex