Bonjour à tous,
Voila je developpe pour mon travail une classe en php5 basé sur DOM pour pouvoir faire des add/mod/del sur un fichier XML.
Comment cela devrait fonctionner :
- pour un add/mod, il faut passer en parametre le chemin du fichier, le xpath pour trouver où faire l'ajout ou la suppression et les données sous forme d'une chaine au format XML
- pour le del, le chemin et le xpath suffisent.
Le mod fonctionne tres bien, ce qui n'est pas le cas du add et du del.
Que ce passe t il :
si je fais l'enregistrement dans un fichier different de mon fichier source, cela fonctionne tres bien.
Le probleme est quand je veux sauvegarder les modifications dans mon fichier source.
Si j'affiche la chaine que je vais enregistrer juste avant de le faire elle est bonne.
Ensuite je fais mon enregistrement, puis je recharge le fichier et je l'affiche, il est bon.
J'en viens au probleme a proprement parler, lorsque j'ouvre avec un editeur (dreamweaver,editplus,wordpad,...) mon fichier mise à jour, cela ne va plus du tout.
Je m'explique :
- dans le cas d'un add, il a fait deux fois l'ajout demandé
- dans le cas d'un del, il l'a fait deux fois aussi.
Cela fait 1 semaine que je me prends la tete la dessus sans pouvoir comprendre quoi que ce soit...
Au secours, à l'aide, SOS, Please help !!!!!
Voici le code source du truc :
/*****DEBUT CLASSE XML *****/
class xml
{
public function load_file($path) {
$returnValue=simplexml_load_file($path);
return $returnValue;
}
public function load_chaine($chaine) {
$returnValue=simplexml_load_string($chaine);
return $returnValue;
}
public function add($path,$xpath,$data) {
//creation obj DOM
$doc = new DOMDocument;
//charge fichier xml d'origine
$doc->load($path);
//creation obj DOM xpath
$doc_xpath = new DOMXPath($doc);
//recherche par xpath du noeud où ajouter (normalement une seule reponse)
$entries=$doc_xpath->query($xpath);
//on selectionne la reponse
$addme=$entries->item(0);
$pNode=$addme->parentNode;
//conversion de la chaine en obj simplexml
$data=$this->load_chaine($data);
//conversion de l'obj simplexml en obj DOM
$data=dom_import_simplexml($data);
//inclusion de l'obj au document courant
$data=$doc->importNode($data,true);
//ajout des donnees
$pNode->appendChild($data);
//enregistrement du fichier
$this->save($path,$doc->saveXML());
}
public function mod($path,$xpath,$data) {
//creation obj DOM
$doc = new DOMDocument;
//charge fichier xml d'origine
$doc->load($path);
//creation obj DOM xpath
$doc_xpath = new DOMXPath($doc);
//recherche par xpath du noeud a modifier (normalement une seule reponse)
$entries=$doc_xpath->query($xpath);
//on selectionne la reponse
$modme=$entries->item(0);
$pNode=$modme->parentNode;
//conversion de la chaine en obj simplexml
$data=$this->load_chaine($data);
//conversion de l'obj simplexml en obj DOM
$data=dom_import_simplexml($data);
//inclusion de l'obj au document courant
$data=$doc->importNode($data,true);
//modification des donnees
$pNode->replaceChild($data, $modme);
//enregistrement du fichier
$this->save($path,$doc->saveXML());
}
public function del($path,$xpath) {
//creation obj DOM
$doc = new DOMDocument;
//charge fichier xml d'origine
$doc->load($path);
//creation obj DOM xpath
$doc_xpath = new DOMXPath($doc);
//recherche par xpath du noeud a supprimer (normalement une seule reponse)
$entries=$doc_xpath->query($xpath);
//on selectionne la reponse
$delme=$entries->item(0);
$pNode=$delme->parentNode;
//suppression des donnees
$pNode->removeChild($delme);
//enregistrement du fichier
$this->save($path,$doc->saveXML());
//si cette ligne est presente il ne double pas la supprission mais il fait une erreur
//@$pNode->removeChild($delme);
}
private function save($path,$str_xml) {
$fic=fopen($path,"w");
fwrite($fic,$str_xml);
fclose($fic);
}
}
/*****FIN CLASSE XML *****/
/*****DEBUT FICHIER XML *****/
<?xml version="1.0" encoding="iso-8859-1"?>
<MENU>
<ELEMENT>
<TYPE>rep</TYPE>
<ID>accueil</ID>
<HTML actif="no"/>
<IMAGE>my_mod.png</IMAGE>
<IMAGE_OVER>my_mod_over.png</IMAGE_OVER>
<OPEN_IN/>
<CONTENT>
<ELEMENT>
<TYPE>1</TYPE>
<ID>accueil_user</ID>
<HTML actif="no"/>
<IMAGE>gohome.png</IMAGE>
<IMAGE_OVER>gohome_over.png</IMAGE_OVER>
<OPEN_IN>same</OPEN_IN>
<CONTENT>
<PACK>accueil</PACK>
<SUBPACK>user</SUBPACK>
</CONTENT>
</ELEMENT>
<ELEMENT>
<TYPE>4</TYPE>
<ID>google</ID>
<HTML actif="yes"><b>Google</b></HTML>
<IMAGE>myelem.png</IMAGE>
<IMAGE_OVER>myelem_over.png</IMAGE_OVER>
<OPEN_IN>new</OPEN_IN>
<CONTENT>http://www.google.fr/search?client=firefox&hl=fr&q=joelle</CONTENT>
</ELEMENT>
</CONTENT>
</ELEMENT>
<ELEMENT>
<TYPE>rep</TYPE>
<ID>accueil</ID>
<HTML actif="no"/>
<IMAGE>my_mod.png</IMAGE>
<IMAGE_OVER>my_mod_over.png</IMAGE_OVER>
<OPEN_IN/>
<CONTENT>
<ELEMENT>
<TYPE>rep</TYPE>
<ID>accueil</ID>
<HTML actif="no"/>
<IMAGE>my_mod.png</IMAGE>
<IMAGE_OVER>my_mod_over.png</IMAGE_OVER>
<OPEN_IN/>
<CONTENT/>
</ELEMENT>
<ELEMENT>
<TYPE>rep</TYPE>
<ID>accueil</ID>
<HTML actif="no"/>
<IMAGE>my_mod.png</IMAGE>
<IMAGE_OVER>my_mod_over.png</IMAGE_OVER>
<OPEN_IN/>
<CONTENT>
<ELEMENT>
<TYPE>url</TYPE>
<ID>google</ID>
<HTML actif="yes"><b>Google</b></HTML>
<IMAGE>myelem.png</IMAGE>
<IMAGE_OVER>myelem_over.png</IMAGE_OVER>
<OPEN_IN>new</OPEN_IN>
<CONTENT>http://www.google.fr/search?client=firefox&hl=fr&q=joelle</CONTENT>
</ELEMENT>
</CONTENT>
</ELEMENT>
</CONTENT>
</ELEMENT>
<ELEMENT>
<TYPE>rep</TYPE>
<ID>accueil</ID>
<HTML actif="no"/>
<IMAGE>my_mod.png</IMAGE>
<IMAGE_OVER>my_mod_over.png</IMAGE_OVER>
<OPEN_IN/>
<CONTENT>
<ELEMENT>
<TYPE>url</TYPE>
<ID>google</ID>
<HTML actif="yes"><b>Google</b></HTML>
<IMAGE>myelem.png</IMAGE>
<IMAGE_OVER>myelem_over.png</IMAGE_OVER>
<OPEN_IN>new</OPEN_IN>
<CONTENT>http://www.google.fr/search?client=firefox&hl=fr&q=joelle</CONTENT>
</ELEMENT>
<ELEMENT>
<TYPE>pack</TYPE>
<ID>accueil_user</ID>
<HTML actif="no"/>
<IMAGE>gohome.png</IMAGE>
<IMAGE_OVER>gohome_over.png</IMAGE_OVER>
<OPEN_IN>same</OPEN_IN>
<CONTENT>
<PACK>accueil</PACK>
<SUBPACK>admin</SUBPACK>
</CONTENT>
</ELEMENT>
</CONTENT>
</ELEMENT>
<ELEMENT>
<TYPE>rep</TYPE>
<ID>accueil</ID>
<HTML actif="no"/>
<IMAGE>my_mod.png</IMAGE>
<IMAGE_OVER>my_mod_over.png</IMAGE_OVER>
<OPEN_IN/>
<CONTENT/>
</ELEMENT>
</MENU>
/*****FIN FICHIER XML *****/
/*****DEBUT FICHIER TEST *****/
$xml = new xml();
$data="\n\t<ELEMENT>\n\t\t<TYPE>rep</TYPE>\n\t\t<ID>joelle</ID>\n\t\t<HTML actif=\"no\"/>\n\t\t<IMAGE>my_mod.png</IMAGE>
\n\t\t<IMAGE_OVER>my_mod_over.png</IMAGE_OVER>\n\t\t<OPEN_IN/>\n\t\t<CONTENT/>\n\t</ELEMENT>";
//$xml->add("./../packages/accueil/user/menu_tmp.xml",'/MENU/ELEMENT[1]/CONTENT/ELEMENT',$data);
//$xml->mod("./../packages/accueil/user/menu_tmp.xml",'/MENU/ELEMENT[1]/CONTENT/ELEMENT[2]',$data);
$xml->del("./../packages/accueil/user/menu.xml",'/MENU/ELEMENT[1]/CONTENT/ELEMENT[2]');
/*****FIN FICHIER TEST *****/