IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[DOM] Classe pour modification d'un fichier XML


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    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 : 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
    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:

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Pour comparaison, voici la partie de code permettant la modification des infos concernant les liens:

    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
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bon, à force d'essayer tout et n'importe quoi, j'ai trouvé quelque chose qui fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->doc->documentElement->replaceChild($itemNode, $item);
    Pourtant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $root = $this->doc->documentElement;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. [Débutant] Classe ou tuto pour lire/ecrire des fichiers XML
    Par BasicZX81 dans le forum VB.NET
    Réponses: 13
    Dernier message: 01/10/2014, 09h19
  2. API DOM pour la lecture de fichier XML
    Par gege2061 dans le forum Contribuez
    Réponses: 1
    Dernier message: 01/12/2010, 21h24
  3. plateforme adéquate pour interagir avec un fichier XML
    Par sebfag dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 07/02/2006, 17h53
  4. [DOM] Modification d'un fichier XML
    Par nana1 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 22/11/2005, 00h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo