Insérer des données dans un fichier XML

Insérer des données dans un fichier XML - PHP - Programmation

Marsh Posté le 16-02-2005 à 20:49:13    

Bonjour à tous
 
Je me suis fait une petite liste perso de mes DVD, jeux etc. Vu que je n'en ai pas des masses, j'ai préféré un fichier XML à une base de données.
 
Pour afficher la liste j'ai vilement pompé du code sur un tuto (rappelons que c'est pour mon usage perso), mais maintenant je trouve que c'est quand-même nettement plus chiant d'insérer à la main des données dans un fichier XML que dans un fichier texte.
Pourquoi je ne reste pas au fichier texte me direz-vous ? Parce que j'ai envie de faire du XML/php, parce qu'il paraît que XML c'est l'avenir :p
Et pourquoi je n'utilise pas une BDD ? Outre "la même raison", je trouve dommage d'utiliser un serveur en plus, de créer une base et tout, juste pour stocker 30 noms (bon, un peu plus, mais ça vaut vraiment pas le coup je pense).
 
Bref, maintenant je veux me faire une tite page qui me permettrait d'insérer des données dans un de mes fichiers XML.
Alors j'ai cherché un peu partout des tutos et aides pour ça, mais j'ai surtout trouvé des tutos pour insérer des données dans une BDD après avoir converti en flux XML (ce dont je ne comprend pas l'interêt au passage, mais ce n'est pas le sujet).
 
J'imagine que j'ai mal cherché, mais n'empêche que le résultat est le même, je ne sais pas comment insérer des nouvelles données dans un fichier XML existant.
 
Est-ce que vous sauriez m'aider, en me donnant des liens ou carrément en me disant comment faire ?
 
Merci ! :)

Reply

Marsh Posté le 16-02-2005 à 20:49:13   

Reply

Marsh Posté le 16-02-2005 à 21:15:59    

Matte les fonctions de php, addchild etc ;)

Reply

Marsh Posté le 16-02-2005 à 21:17:01    

Ben sinon je suis con mais sur les tutos que ta trouvé ben c pareil sauf que tu remplaces les résultats de ta DB par ce que tu veux (ton formulaire ou autre je ne sais pas)

Reply

Marsh Posté le 16-02-2005 à 21:17:41    

Oui, admettons que tu stockes tes truc selon le shema :  
 
Titre/Type/Année/Metteur en Scene/Durée/Acteurs  
 
tu te fais un script qui insere :
 
<titre>$lenom</titre>
<type>$letype</type>
...
 
Dans ton fichier XML. Sinon tu peux le faire avec le parseur XML mais si t'a aucune connaissance en php tu risques de morfler :p ... Quoique ce serait pas plus mal d'apprendre qqch


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 16-02-2005 à 21:49:03    

Je@nb a écrit :

Matte les fonctions de php, addchild etc ;)


 
Heu, sur la doc php j'ai pas trouvé addchild :o
 

esox_ch a écrit :

Sinon tu peux le faire avec le parseur XML mais si t'a aucune connaissance en php tu risques de morfler :p ... Quoique ce serait pas plus mal d'apprendre qqch


 
C'est pas que je n'aie aucune connaissance en php, c'est que je n'ai aucune connaissance du côté xml et traitement de texte (parsing...) de php (par contre je gère correctement le côté BDD) [:aloy].
 
Sinon mon fichier XML est encore plus simple, c'est genre

Code :
  1. <liste>
  2.   <cat nom="">
  3.     <item>
  4.       <nom>...</nom>
  5.     </item>
  6.     <item>
  7.       <nom>...</nom>
  8.     </item>
  9.   </cat>
  10. </liste>


 
Je ne sais plus pourquoi j'avais mis cat (je voulais mettre d'autres cats mais en fait j'ai séparé les fichiers... tiens, pourquoi je me fais chier, je pourrais plutot faire plusieurs cats :o), mais j'avais mis item/nom en prévision d'ajouter des trucs sous item (genre, effectivement, type etc).
Je change pas <item> en <film>, parce que ca me sert pour des films, des jeux, des livres etc.
 
En fait je sais (théoriquement dirons-nous :p) ajouter des données à un fichier texte, c'est juste que je ne sais pas comment en ajouter "avant </liste>" par exemple... et je pensais qu'il y aurait une fonction de php qui permettrait ça sans passer par les fopen, fread & co...
 
merci ! :)

Reply

Marsh Posté le 16-02-2005 à 21:52:33    

Ooups, addChild c'est en delphi, en php matte plutot ça : http://www.php.net/manual/fr/funct [...] -child.php

Reply

Marsh Posté le 16-02-2005 à 22:41:43    

ok merci je vais jeter un oeil :)

Reply

Marsh Posté le 17-02-2005 à 12:08:02    

Bon, j'ai essayé de regarder ce qu'on trouve ici : http://fr2.php.net/manual/fr/ref.dom.php
Apparament DOM XML n'est pas dispo sur PhP5 (ce que j'utilise), et il faut utiliser DOM tout court, qui a l'air de faire globalement la même chose.
 
J'ai compris comment on insère un élément, mais pas comment on fait pour l'insérer après un autre élément. Je m'explique.
 
Mon fichier XML actuel est presque complexe (mais vraiment presque), pour simplifier pour le moment, utilisons ceci :

Code :
  1. <liste>
  2.   <item>
  3.     <nom>nom 1</nom>
  4.   </item>
  5. </liste>


Imaginons que je veuille insérer un item après celui existant. Pour insérer un item, je fais ceci :

Code :
  1. $item = $document->createElement("item" );
  2. $item = $document->appendChild($item);
  3. $nom = $document->createElement("nom","nom 2" );
  4. $nom = $item->appendChild($nom);


Le problème, c'est que cette méthode donne ceci comme résultat :

Code :
  1. <liste>
  2.   <item>
  3.     <nom>nom 1</nom>
  4.   </item>
  5. </liste>
  6. <item><nom>nom 2</nom></item>


Comme vous le voyez, il y a un problème. Comment puis-je faire pour dire que je veux que ça l'insère dans le noeud liste ?
 
Merci ! :)

Reply

Marsh Posté le 17-02-2005 à 12:09:41    

tu l'ouvres ton xml avant ?

Reply

Marsh Posté le 17-02-2005 à 12:11:36    

Reply

Marsh Posté le 17-02-2005 à 12:11:36   

Reply

Marsh Posté le 17-02-2005 à 12:23:59    

Ben en fait j'ai déjà regardé ces pages, mais j'ai rien vu qui me permette de faire ce que je veux, et honnêtement, je comprend rien aux contributions des utilisateurs, donc si la solution est dedans je ne la comprend pas, et si elle n'est pas dans les contributions, je ne la vois pas :o.
 
Voici mon code complet, le fichier "document.xml" comportant le contenu cité plus haut :
 

Code :
  1. $document = DOMDocument::load("document.xml" );
  2. $item = $document->createElement("item" );
  3. $item = $document->appendChild($item);
  4. $nom = $document->createElement("nom","nom de l'item 2" );
  5. $nom = $item->appendChild($nom);
  6. print $document->saveXML();


 
merci

Reply

Marsh Posté le 17-02-2005 à 13:51:36    

Je vais faire un test, j'ai pas bcp de temps là mais il me semblait pas que ct si difficile :)

Reply

Marsh Posté le 18-02-2005 à 01:36:56    

cosmoschtroumpf a écrit :

$document = DOMDocument::load("document.xml" );
 
$item = $document->createElement("item" );
$item = $document->appendChild($item); // le problème est là
$nom = $document->createElement("nom","nom de l'item 2" );
$nom = $item->appendChild($nom);
 
print $document->saveXML();

Pour faire un appendChild, il faut se positionner, là où l'on souhaite ajouter l'enfant (logique non ?).
 
Dans ton cas, tu pourrais faire :  
$document->documentElement->appendChild($item);
(documentElement représente la racine du document)

Reply

Marsh Posté le 18-02-2005 à 11:23:10    

Effectivement, ça marche, merci :love:
 
 
Nouveau problème maintenant :
 
Pour simplifier j'avais mis mon document xml en <liste><item><nom>. Mais en fait, c'est comme ça :
 

Code :
  1. <liste>
  2.   <cat nom="cat 1">
  3.     <item><nom>item 1</nom></item>
  4.   </cat>
  5.   <cat nom="cat 2">
  6.     <item><nom>item 2</nom></item>
  7.   </cat>
  8. </liste>


 
Là, comment je fais pour choisir la cat que je veux ? J'ai regardé les fonctions que je pensait qui le faisaient, mais j'ai pas trouvé... :/
 
 
merci beaucoup ! :)

Reply

Marsh Posté le 18-02-2005 à 14:47:03    

Tu peux faire ça avec dom (getElementsById puis vérifier chaque élément avec getAttribute), mais une requête xpath est sûrement plus adapté.

Code :
  1. $item = $document->createElement("item" );
  2. $nom = $document->createElement("nom","nom de l'item 2" );
  3. $item->appendChild($nom);
  4. $xpath = new DOMXPath($document);
  5. $xNodes = $xpath->query('//cat[@nom="cat 1"]'); // c'est ça la requêtte ;)
  6. // $xNodes est une NodeList
  7. foreach($xNodes as $cat){
  8. $cat->appendChild($item); // Pour chaque élément de la liste on ajoute $item
  9. }


+ sur xpath : http://jerome.developpez.com/xmlxsl/xpath/

Reply

Marsh Posté le 23-02-2005 à 19:05:06    

Yeah ça marche :love:
 
Bon je vais tester ça sur un vrai fichier maintenant :D
 
merci :)
 
Je reviendrais, j'ai quelques petites questions, notamment comment trier alphabétiquement une liste en xml, et comment mettre correctement en forme le xml quand on l'insère (là ça met tout sur la même ligne :()

Reply

Marsh Posté le 23-02-2005 à 22:02:34    

cosmoschtroumpf a écrit :

Yeah ça marche :love:
 
Bon je vais tester ça sur un vrai fichier maintenant :D
 
merci :)
 
Je reviendrais, j'ai quelques petites questions, notamment comment trier alphabétiquement une liste en xml


Avec XSL : http://www.php.net/manual/fr/ref.xsl.php
http://www.haypocalc.com/prog/xslt.php

Citation :

et comment mettre correctement en forme le xml quand on l'insère (là ça met tout sur la même ligne :()

$document->formatOutput = TRUE;

Reply

Marsh Posté le 24-02-2005 à 13:48:35    

Kalex je te kiffe :love:
 
 
 
Heu... :o
 
 
Merci ça marche :D
Je reviendrais plus tard, quand j'en chierais pour modifier et supprimer des entrées :whistle:

Reply

Marsh Posté le 25-02-2005 à 16:56:57    

Bonjour  
 
je cherche a faire la meme chose mais je n'y  arrive pas
 
Mon fichier XML
 

Citation :

<?xml version='1.0' encoding='ISO-8859-1' ?>
<reserve>
 <personne>
  <nom>Choulant</nom>
  <prenom>Noham</prenom>
 </personne>
</reserve>


 
je voudrais pouvoir rajouter des personne avec leur nom et prenom;
 
Le code

Code :
  1. <?
  2. $document = DOMDocument::load("donnee.xml" );
  3. $item = $document->createElement("personne" );
  4. $item = $document->documentElement->appendChild($item);
  5. $nom = $document->createElement("nom","DUPOND" );
  6. $nom = $item->appendChild($nom);
  7. $prenom = $document->createElement("prenom","paul" );
  8. $prenom = $item->appendChild($prenom);
  9. $document->saveXML();
  10.    
  11. ?>


 
Mais rien a faire rien ne veux s'inscrire ??
 
Merci de votre aide


Message édité par pc15268 le 25-02-2005 à 16:58:59
Reply

Marsh Posté le 20-05-2008 à 18:33:00    

Il existe la même chose avec simpleXML ou alors il faut obligatoirement DOM ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed