Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/11/2006, 23h07   #1
Invité de passage
 
Inscription : octobre 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 12
Points : 2
Points : 2
Par défaut [DOM] Suppression d'un noeud

Bonjour,

J'ai essayé avec simpleXml puis avec Dom de supprimer un noeud donné, mais je n'arrive pas à mes fins.

Voici le fichier xml en question :

Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<categories>
<categorie>
<nom>Divers 2005</nom>
<description/>
<album>
<lien>http://www.bubbleshare.com/feed.xml</lien>
</album>
<album>
<lien>http://www.bubbleshare.com/feed.xml</lien>
</album>
</categorie>
<categorie>
<nom>Divers 2006</nom>
<description/>
<album>
<lien>http://www.bubbleshare.com/feed.xml</lien>
</album>
<album>
<lien>http://www.bubbleshare.com/feed.xml</lien>
</album>
</categorie>
</categories>

Le paramètre passé par le formulaire est le nom de la catégorie.

Je cherche dans un premier temps à effacer une catégorie entière.

J'utilise le code suivant (que j ai fait varié) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 $dom = new DOMDocument();
  $dom->load('liste.xml');
 
  $book = $dom->documentElement;
 
      $i=0;
      do {
        $categorie = $book->getElementsByTagName('categorie')->item(0)->nom->nodevalue;
 
        $i=$i+1;
      } while ($categorie != $_GET['categ']);
      $i=$i-1;
 
 
 $book->removeChild($categorie);
 
  echo $dom->save('test.xml');
D'avance merci
nightf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 23h16   #2
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Bonjour,
Merci de prendre l'habitude de donner tous les messages d'erreurs lorsque tu postes pour un problème.
Celui que tu reçois te dit probablement que tu utilises le mauvais type d'objet pour removeChild. $categorie contient une chaîne de caractères, et removeChild attend une référence sur le noeud.
Il faut que tu fasses quelque chose comme ça à l'intérieur de ton do-while :
Code :
1
2
$categorie = $book->getElementsByTagName('categorie')->item(0);
$nomCategorie = $categorie->nom->nodeValue;
Voilà, si j'ai bien compris ce que tu voulais faire...
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 23h22   #3
Invité de passage
 
Inscription : octobre 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 12
Points : 2
Points : 2
Par défaut aucun message d'erreur

Mais je n'ai pas de message d'erreur. Il me manque certainement une option à cocher.

En tout cas, avec le code que tu m'as cité, si je fais un echo du $nomCategorie, il n'affiche rien.
nightf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 23h26   #4
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par nightf
Mais je n'ai pas de message d'erreur. Il me manque certainement une option à cocher.
J'espère qu'ils ne sont pas désactivés, on ne peut pas faire de développement sans messages d'erreurs.
A mettre en début de ton code :
Code :
error_reporting(E_ALL);
Citation:
Envoyé par nightf
En tout cas, avec le code que tu m'as cité, si je fais un echo du $nomCategorie, il n'affiche rien.
Et avant tu affichais quelque chose avec $categorie ? Je n'ai pas vérifié la récupération de la chaîne, je l'ai réutilisée telle quelle. A la réflexion je ne vois pas comment tu peux récupérer quoi que ce soit avec "->nom", pour moi il faut réutiliser getElementsbyTagName.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 23h29   #5
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Un ptit lien au passage : Gestion du XML en PHP5 / Rechercher et récupérer un élément
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2006, 20h19   #6
Invité de passage
 
Inscription : octobre 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 12
Points : 2
Points : 2
Par défaut Presque réussi

Merci pour toute l'aide, j'arrive à effacer des catégories dans mon document xml

Pour les albums, j'obtiens le message suivant:

Citation:
Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in C:\gestour\www\add_links.php:89 Stack trace: #0 C:\gestour\www\add_links.php(89): DOMNode->removeChild(Object(DOMElement)) #1 {main} thrown in C:\gestour\www\add_links.php on line 89
avec le code suivant :



Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$doc = $dom->documentElement;
 
      $i=0;
        $categorie = $doc->getElementsByTagName('categorie');
       for ($j = 0; $j < $categorie->length; $j++) {
            $itemCat=$categorie->item($j);
            $nomalbum = $itemCat->getElementsByTagName('album');
            for ($i = 0; $i < $nomalbum->length; $i++) {
                $itemalb=$nomalbum->item($i);
                $liens = $itemalb->getElementsByTagName('lien');
                $itlien=$liens->item(0);
                //echo $itlien->firstChild->nodevalue;
                foreach($liens as $lien){
                      if($lien->firstChild->nodeValue==$_GET['alb'])
                      {
                        echo 'effacement';
                        $oldalb = $doc->removeChild($itlien);
                      }
                    }
            }
        }
  $dom->save('liste.xml');

Je pense que c'est un problème de typage, mais j'avoue que je vois pas bien.

Merci pour votre aide
nightf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2006, 22h32   #7
Invité de passage
 
Inscription : octobre 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 12
Points : 2
Points : 2
Par défaut Stack trace?

Je n'ai pas trouvé d'infos en plus sur le sujet.

Quelqu'un connait ce message d'erreur ?
nightf est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h41.


 
 
 
 
Partenaires

Hébergement Web