Bonjour !!
J'ai un souci depuis quelques jours, j'ai essayé pas mal de chose mais pas grand chose ne marche. Ma solution est vraiment très très sale mais je ne trouve pas mieux...
J'ai un fichier XML :
Je dois parcourir ce XML, pour chaque product vérifier si la date est passée et si c'est le cas, je traite les noeuds fils puis je dois supprimer le noeud du fichier XML.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <products> <product date="20120418"> ...... </product> <product date="20120501"> ...... </product> <product date="20120420"> ...... </product> <product date="20120602"> ...... </product> </products>
L'idée est qu'à la fin mon fichier XML ressemble à ça :
Mon gros souci est que la fonction removeChild du DOM supprime le contexte en s’exécutant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <products> <product date="20120501"> ...... </product> <product date="20120602"> ...... </product> </products>
Donc après avoir executer $book->removeChild($chapter); mon $book n'a plus de contexte et n'est plus capable de continuer.
doc du DOM PHP
Résultat ma fonction supprime bien la première la première occurence de "product" puis sort du traitement.After calling this method, the DOMNode::$namespaceURI property on the parent node will be reset to NULL.
La méthode préconisé pour contourné le problème est :
Mais j'ai une erreur sur $nsuri = $book->namespaceURI; :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <?php $doc = new DOMDocument; $doc->load('book.xml'); $book = $doc->documentElement; // we retrieve the chapter and remove it from the book $chapter = $book->getElementsByTagName('chapter')->item(0); // copy the namespace URI $nsuri = $book->namespaceURI; // Delete the child node $book->removeChild($chapter); // paste the namespace URI back into the parent node $book->namespaceURI = $nsuri; ?>
Forcément on voit dans la doc que cet attribut de classe est en read only, donc j'ai une fatal error. La doc ici
Moralité : la solution que j'ai trouvé est de rééxecuter ma fonction autant que nécessaire, mais cela veut dire que à chaque fois je redéfini le dom, je recharge le fichier, je reparcours, je supprime un noeud et je recommence tout. C'est super lourd et extrêmement lent.
Auriez vous une autre solution pour parcourir un arbre XML et supprimer des neouds au fur et a mesure du parcours?
Merci !!
Partager