Probleme modifier xml !

Résolu
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007 - 20 juil. 2006 à 11:33
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

17 réponses

massacr Messages postés 233 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 4 janvier 2007
23 juil. 2006 à 16:13
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...
3
massacr Messages postés 233 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 4 janvier 2007
24 juil. 2006 à 09:36
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.
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 juil. 2006 à 13:35
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.
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
20 juil. 2006 à 13:55
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 juil. 2006 à 15:33
Vérifie ce que te renvoie documentElement, déjà, comme noeud.
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
20 juil. 2006 à 15:55
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;
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 juil. 2006 à 16:27
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...
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
20 juil. 2006 à 16:36
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.
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
21 juil. 2006 à 11:04
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.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 juil. 2006 à 11:54
Xpath peut utiliser une fonction sort (). Ca devrait faire l'affaire.
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
21 juil. 2006 à 12:03
    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";
      }       
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
21 juil. 2006 à 16:14
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.
0
massacr Messages postés 233 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 4 janvier 2007
22 juil. 2006 à 19:16
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à.       

 
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
23 juil. 2006 à 10:28
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.
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
23 juil. 2006 à 11:30
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 .
0
chanandler Messages postés 86 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 3 décembre 2007
23 juil. 2006 à 19:28
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
0
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
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.
0
Rejoignez-nous