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 09/10/2007, 23h30   #1
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
Par défaut [DOM] Classe pour modification d'un fichier XML

Bonjour à tous!

En ce moment, je travaille sur mon site. Pour y voir un peu plus clair, je crée des classes à partir de mes anciennes fonctions. Ainsi, toutes les fonctions nécessaires à la gestion des news sont maintenant les méthodes de la classe "news".

Les news sont stockées dans un fichier XML dans lequel il faut pouvoir écrire les news, les modifier et les supprimer pour cela, j'utilise le DOM. Je procède de la même façon pour les liens.

Pour la gestion des liens, il n'y a aucun problème. Pour la gestion des news l'ajout et la suppression fonctionnent. Par contre, la modification renvoie un message d'erreur ce qui est bizarre car la modification des liens est pratiquement identique.

Voici la partie du code permettant la modification:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
// Fonction de modification
public function modifNews($id, $titre, $desc, $content, $url) {
 
   if(!file_exists($this->xml)) {
      echo "<p>Erreur lors du chargement du fichier XML.</p>";
   }
   else {
      $this->doc->load($this->xml);
      $root = $this->doc->documentElement;
      $items = $this->doc->getElementsByTagName('item');
      $date = $this->afficheDate($this->xml);
      $i = 0;
 
      // Récupération des noeuds non modifiables pour les réécrire.
      foreach($items as $item) {
         $idNews = $item->getAttribute("id");
         $display = $date[$i]['display'];
         $archDate = $date[$i]['archive'];
         $rssDate = $date[$i]['rss'];
 
         // Si l'id correspond au paramètre reçu par la fonction, réécriture du noeud.
         if($idNews == $id) {
            // Création du noeud item.
	    $itemNode = $this->doc->createElement('item');
            $itemNode->appendChild(new DOMAttr('id', $id));
            // Noeud titre.
	    $titleNode = $itemNode->appendChild(new DOMElement('title', utf8_encode(stripslashes($titre))));
	    // Noeud date.
	    $dateNode = $itemNode->appendChild(new DOMElement('date'));
	    $dispNode = $dateNode->appendChild(new DOMElement('display', $display));
	    $archNode = $dateNode->appendChild(new DOMElement('archive', $archDate));
	    $rssNode = $dateNode->appendChild(new DOMElement('rss', $rssDate));
	    // Noeud description.
	    $descNode = $itemNode->appendChild(new DOMElement('description', utf8_encode(stripslashes($desc))));
	    // Contenu.
	    $textNode = $itemNode->appendChild(new DOMElement('content'));
	    $dataNode = $textNode->appendChild(new DOMCDATASection(utf8_encode(stripslashes($content))));
	    // URL
	    $urlNode = $itemNode->appendChild(new DOMElement('url', htmlentities($url)));
	    // Remplacement de l'ancien noeud.
	    $root->replaceChild($itemNode, $item);
	    parent::saveFile();
         }
      $i++;
      }
   }
}
Et son message d'erreur:

Citation:
Fatal error: Uncaught exception 'DOMException' with message 'Wrong Document Error' in C:\Program Files\wamp\www\SiteV4\admin\include\class_news.php:232 Stack trace: #0 C:\Program Files\wamp\www\SiteV4\admin\include\class_news.php(232): DOMNode->replaceChild(Object(DOMElement), Object(DOMElement)) #1 C:\Program Files\wamp\www\SiteV4\admin\pages\modNews.php(51): news->modifNews('16', 'Mise ? jour du ...', 'Quelques nouvea...', 'Le site n\'a pa...', '') #2 {main} thrown in C:\Program Files\wamp\www\SiteV4\admin\include\class_news.php on line 232
Je ne comprends pas ce qui est à l'origine du problème donc je me permets de faire appel à votre aide. Je tiens à signaler que cela fonctionnait quand il s'agissait d'une fonction écrite dans la page permettant la modification.

La ligne 232 est celle-ci:

Code :
$root->replaceChild($itemNode, $item);
J'espère vous avoir donné suffisamment d'informations. Je vous remercie d'avance pour l'aide que vous m'apporterez.
Dookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2007, 23h38   #2
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
Pour comparaison, voici la partie de code permettant la modification des infos concernant les liens:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
// Fonction de modification
public function modifLink($id, $nom, $url, $genre, $lg) {
 
  if(!file_exists($this->xml)) {
    echo "<p>Erreur lors du chargement du fichier XML.</p>";
  }
  else {
    $this->doc->load($this->xml);
    $root = $this->doc->documentElement;
    $links = $this->doc->getElementsByTagName('link');
 
    // Récupération des noeuds non modifiables pour les réécrire.
    foreach($links as $link) {
      $idLink = $link->getAttribute("id");
 
      // Si l'id correspond au paramètre reçu par la fonction, réécriture du noeud.
      if($idLink == $id) {
        // Création du noeud link.
        $linkNode = $this->doc->createElement('link');
        $linkNode->appendChild(new DOMAttr('id', $id));
        // Noeud titre.
        $nameNode = $linkNode->appendChild(new DOMElement('name', utf8_encode(stripslashes($nom))));
        $urlNode = $linkNode->appendChild(new DOMElement('url', htmlentities($url)));
        $genreNode = $linkNode->appendChild(new DOMElement('genre', utf8_encode(stripslashes($genre))));
        $langNode = $linkNode->appendChild(new DOMElement('language', utf8_encode(stripslashes($lg))));
 
        // Le noeud "link" est remplacé par le noeud venant d'être créé.
	$root->replaceChild($linkNode, $link);
 
	parent::saveFile();
      }
    }
  }
}
La même méthode est employée, une seule différence: ça fonctionne. D'ailleurs je n'arrive pas à comprendre ce qui coince donc si vous pouviez y jeter un œil, se serait bien aimable. Si vous avez besoin d'autres éléments, n'hésitez pas à le dire
Dookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 14h59   #3
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
Bon, à force d'essayer tout et n'importe quoi, j'ai trouvé quelque chose qui fonctionne:

Code :
1
2
 
$this->doc->documentElement->replaceChild($itemNode, $item);
Pourtant

Code :
1
2
 
$root = $this->doc->documentElement;
et

Code :
1
2
 
$root->replaceChild($itemNode, $item);
ne fonctionne pas

Une bonne âme pourrait-elle m'éclairer à ce sujet?

EDIT: Le fait de déclarer la variable $root avant la modification fonctionne également.
Dookie 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 06h23.


 
 
 
 
Partenaires

Hébergement Web