Probleme modifier xml ! [Résolu]

Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
- - Dernière réponse : chanandler
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
- 24 juil. 2006 à 10:14
Bonjour,

Jai créé un script pour modifier un fichier xml a un certain endroit mais ca marche pas et je voie pas où est l'erreur pourriez vous m'aider merci

Fichier XML :

<galerie>

<nom>grenou.jpg</nom>
<description>
<date>26/02/2006</date>
<evenement>bapteme</evenement>

Mamie

</description>

</galerie>

Script PHP :

    function modifxml($nomphoto,$date,$evenement,$personnage,$fichier_xml)
    {   
      $modif = new DomDocument;
      //Permet de créer les différents noeud pour les nouvelles photo.
    $newphoto = $modif->createElement('photo');
    $newnom = $modif->createElement('nom',$nomphoto);
    $newdescription = $modif->createElement('description');
    $newdate = $modif->createElement('date',$date);
    $newevenement = $modif->createElement('evenement',$evenement);
    $newprotagoniste = $modif->createElement('protagoniste');
        //Boucle permettant l'ajout de plusieurs personnage.
        foreach($personnage as $element)
        {
          $newpersonnage = $modif->createElement('personnage',$element);
        $newprotagoniste->appendChild($newpersonnage);
        }       
       
        //Permet d'ajouter les nouveau fils à la fin des fils.   
        //$galerie->appendChild($newphoto);
        $newphoto->appendChild($newnom);
        $newphoto->appendChild($newdescription);
        $newdescription->appendChild($newdate);
        $newdescription->appendChild($newevenement);
        $newdescription->appendChild($newprotagoniste);

       //creation obj DOM
       $doc = new DOMDocument;
       //charge fichier xml d'origine
       $doc->load($fichier_xml);
       //creation obj DOM xpath
       $doc_xpath = new DOMXPath($doc);
       //recherche par xpath du noeud a supprimer (normalement une seule reponse)
       $entries=$doc_xpath->query('photo[nom="'.$nomphoto.'"]');
       //on selectionne la reponse
       $oldnode=$entries->item(0);

      // Load the $parent document fragment into the current document
      $newnode = $doc->importNode($modif->documentElement, true);
     
      // Replace
      $oldnode->parentNode->replaceChild($newnode, $oldnode);
 
       //enregistrement du fichier
       $doc->save($fichier_xml);
    }

    $perso = array('pierre','paul','jacque','milouse');
    modifxml('grenou.jpg','12/05/2006','Vacance',$perso,'galerie_test.xml');
   
merci
Afficher la suite 

17 réponses

Meilleure réponse
Messages postés
233
Date d'inscription
vendredi 2 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2007
3
Merci
Euh oui exact ca revoie un booléeen. Mais c'est le même système sinon :

$array_unique = array_unique($xml->xpath('//photo/description/protagoniste/personnage'));
sort($array_unique);
foreach($array_unique as $galerie) {
   echo '<option value="'.$galerie.'">'.$galerie.'</option>'."\n";
}

Voilà ca marche pas comme ca ? Par contre tu auras peut etre un problème dans les clés du tableau...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de massacr
Messages postés
233
Date d'inscription
vendredi 2 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2007
3
Merci
Je pense que le mieux c'est de mettre tous les prénoms en majuscules ou en minuscules, voire en minuscules avec la première lettre en majuscule.
Donc tu mets juste avant le "sort" :
foreach($array_unique as galerie) {
   $nouveau_tableau[] = ucfirst(strtolower($galerie));
}
Fais gaffe le tableau s'appelle maintenant $nouveau_tableau.
Fais gaffe aussi aux accents, ils ne seront pas forcément mis en majuscules (ca dépend du serveur).

Bon c'est un peu bourrin comme facon mais je viens de me lever et je vois pas d'autres facons.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de massacr
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Hello,

il serait bon que tu précises ce qui ne marche pas, ce qu'il se passe à la place, et la portin de code incréminée.
Parce que là...je ne vois rien d'anormal.
Commenter la réponse de malalam
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
Il me mais ca comme erreur :




Warning: DOMDocument::importNode() expects parameter 1 to be DOMNode, null given in

Warning: DOMNode::replaceChild() expects parameter 1 to be DOMNode, null given in

merci a toi
Commenter la réponse de chanandler
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Vérifie ce que te renvoie documentElement, déjà, comme noeud.
Commenter la réponse de malalam
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
Si je me trompe pas il faut ca pour voir ce que renvoie documentElement si oui bas il renvoie rien et je voie pas poukoi.



        $modif = new DomDocument;
      //Permet de créer les différents noeud pour les nouvelles photo.
    $newphoto = $modif->createElement('photo');
    $newnom = $modif->createElement('nom','grenou.jpg');
    $newdescription = $modif->createElement('description');
    $newdate = $modif->createElement('date','12/05/2006');
    $newevenement = $modif->createElement('evenement','Vacance');
    $newprotagoniste = $modif->createElement('protagoniste');
        //Boucle permettant l'ajout de plusieurs personnage.
        foreach($perso as $element)
        {
          $newpersonnage = $modif->createElement('personnage',$element);
        $newprotagoniste->appendChild($newpersonnage);
        }       
       
        //Permet d'ajouter les nouveau fils à la fin des fils.   
        //$galerie->appendChild($newphoto);
        $newphoto->appendChild($newnom);
        $newphoto->appendChild($newdescription);
        $newdescription->appendChild($newdate);
        $newdescription->appendChild($newevenement);
        $newdescription->appendChild($newprotagoniste);
   
       echo $modif->documentElement;
Commenter la réponse de chanandler
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Tu te trompes...
documentElement renvoie un élément.
On ne lit pas un élémentcomme ça.

Ceci dit, je me rends compte d'un coup :

si j'ai bien pigé, tu veux importer le document à partir du noeud racine "photo".
Bref, c'est le DOMNode photo que tu dois donner.
documentElement renvoie un type DOMElement!
importNode () attend un type DOMNode!
ce qui est très différent...
Commenter la réponse de malalam
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
Si jai bien compris ce que tu me dis c'est que DOMNode->replaceChild() ne serait pas compatible avec DOMDocument->importNode(). Si c'est bien cela je comprend pas comment passé outre ce probléme car en faite ma fonction doit pouvoir modifier ce que contient les balise photos.




Si tu pouvais eclairer ma lenterne je t'en remerci car la je patoge merci a toi.
Commenter la réponse de chanandler
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
Bonjour,




Juste pour dire que j'ai fini par trouver mon erreur qui était enfin de compte trés bête car je faisait pas d'appenchild pour la balise photo voila tou sinon merci a toi et aussi jai encore une question si ca te derange pas.



Car voila jai une select box qui est alimenté par un foreach avec une requete xpath mais j'aimerai pouvoir classer les élément dans la select box par ordre alphabétique aurais tu une idée pour faire cela merci a toi.
Commenter la réponse de chanandler
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Xpath peut utiliser une fonction sort (). Ca devrait faire l'affaire.
Commenter la réponse de malalam
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
    Sauf que dans mon foreach j'utiliser la fonction array_unique et quand je surcharge en + avec un sort ca marche pas serais tu pourquoi merci a toi  







      //Boucle permettant de récupérer toutes les personnes.
      foreach(array_unique($xml->xpath('//photo/description/protagoniste/personnage')) as $galerie)
      {
                 echo '<option value="'.$galerie.'">'.$galerie.'</option>'."\n";
      }       
Commenter la réponse de chanandler
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
J'ai passé l'aprem a chercher et je ne voie vraiment pas comment trié le foreach accept aucun trie et je ne sais où chercher.




Merci de l'aide que l'on pourra m'apporter.
Commenter la réponse de chanandler
Messages postés
233
Date d'inscription
vendredi 2 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2007
0
Merci
Tu fais :
$array_unique = array_unique($xml->xpath('//photo/description/protagoniste/personnage'));
$array_unique = sort($array_unique);
foreach($array_unique as $galerie) {
   echo '<option value="'.$galerie.'">'.$galerie.'</option>'."\n";
}
Et voilà.       

 
Commenter la réponse de massacr
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Heu...
sort renvoie un booleen. Si tu fais ça, tu vas te retrouver avec un $array_unique qui vaut true. Bref, une variable de type booléen, et plus de type array. Et le foreach va planter.
Ensuite, pourquoi un array_unique () ? On a besoin de ttes les entrées renvoyées par le XPath.
Commenter la réponse de malalam
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
J'ai essayé ta méthode est c'est vrai que ca marche pas sinon j'uitlise un array_unique car comme je remplis mon select avec des prenoms et comme parfois des prenom se répété je veux pas qu'il s'affiche plusieurs fois sinon pas une autre idée pour mon probléme merci a  vous .
Commenter la réponse de chanandler
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
Ca classe bien sauf que quand il rencontre un prenom en majuscule il le classe bien et que en miniscule il le classe mal, serais tu pourquoi merci a toi
Commenter la réponse de chanandler
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
0
Merci
Vi c vrai que c'est un peut bourrin mais pour l'instant je me la met de coté et je vais chercher si y a pas un moyen plus souple pour faire cela merci a toi, tu m'as bien aidé et merci aussi a malalam.
Commenter la réponse de chanandler