PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 18-10-2010 14:41:57

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Ecriture d'un fichier xml

Bonjour,
j'écris en php5 un fichier xml via les methodes DOM. Les noeuds, attributs etc. de mon fichier sont des données d'une table.
Tout va bien, sauf que mon fichier xml s'écrit sur une seule ligne, ce qui n'est tres "lisible".
Auriez vous une solution pour intégrer des sauts de ligne dans le document xml ? merci
mon code :


function writexml()
{
require "cfg_config.php";

$dom = new DomDocument();
$dom -> load("../galeries/Gallery.xml");
$albumsnode = $dom -> getElementsByTagName('albums') -> item(0);
$albumstodelete = $dom -> getElementsByTagName('album'); // on détruit les albums existants
foreach($albumstodelete as $album)
$albumsnode -> removeChild($album);

// on recupere toutes les infos de la table et on réécrit le fichier entierement

$db = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die ("Impossible de se connecter : " . mysql_error());
mysql_select_db($cfgBase,$db);
$query = "SELECT * FROM w_albums";
$send = mysql_query($query, $db) or die('Erreur SQL !<br />'.$query.'<br />'.mysql_error());
 
while($data = mysql_fetch_array($send))
{
$nomalbum = $data['nomalbum'];
$descriptionalbum = $data['descriptionalbum'];
$lienlogo = $data['lienlogo'];
$lienphoto1 = $data['lienphoto1'];
$legende1 = $data['legende1'];

$nouvelalbum = $dom -> createElement("album");
$nouvelalbum -> setAttribute("icon" , $lienlogo);
$nouvelalbum -> setAttribute("thumbnailsFolder" , "galeries/".$nomalbum."/pictos/");
$nouvelalbum -> setAttribute("imagesFolder" , "galeries/".$nomalbum."/images/");
$nouvelalbum -> setAttribute("description" , $descriptionalbum);

$photo1 = $dom -> createElement("image");
$nomphoto1 = substr($lienphoto1, -5);
$photo1 -> setAttribute("name",$nomphoto1);
$photo1 -> setAttribute("description"," : ".$legende1);
$photo1 -> setAttribute("thumbnail",$nomphoto1);

if ($lienphoto2!="") {
$photo2 = $dom -> createElement("image");
$nomphoto2 = substr($lienphoto2, -5);
$photo2 -> setAttribute("name",$nomphoto2);
$photo2 -> setAttribute("description"," : ".$legende2);
$photo2 -> setAttribute("thumbnail",$nomphoto2);
}

$nouvelalbum -> appendChild($photo1);
if (isset($photo2)) { $nouvelalbum -> appendChild($photo2); }

$albums = $dom -> getElementsByTagName("albums")-> item(0);
$albums -> appendChild($nouvelalbum);

} // fin du while
$dom -> save('../galeries/Gallery.xml');
}


 

et donc le fichier xml est ecrit (par exemple) :


<albums><album icon="galeries/logos_clients/logo_test_avec_xml_2.jpg" thumbnailsFolder="galeries/test_avec_xml_2/pictos/" imagesFolder="galeries/test_avec_xml_2/images/" description="test avec xml 2"><image name="1.jpg" description=" : volodine" thumbnail="1.jpg"/></album><album icon="galeries/logos_clients/logo_test_avec_xml_3.jpg" thumbnailsFolder="galeries/test_avec_xml_3/pictos/" imagesFolder="galeries/test_avec_xml_3/images/" description="test avec xml 3"><image name="1.jpg" description=" : coloton" thumbnail="1.jpg"/></album></albums>
 

Tout ca sur une seule ligne... donc bon, ca marche, mais ce n'est pas tres esthetique...

Hors ligne

#2 18-10-2010 16:11:09

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Ecriture d'un fichier xml

Saluton,

fanch75 a écrit :

Tout ca sur une seule ligne... donc bon, ca marche, mais ce n'est pas tres esthetique...

Ça n'est pas le but, si tu veux faire de l'esthétique ouvre ton fichier dans un navigateur et adjoint lui du XSL, ou ouvre-le avec un parser XML.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 18-10-2010 17:01:24

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Ecriture d'un fichier xml

Salut,
hm... bon. Laissons tomber l'esthetique alors.
Par contre, je me rends compte que j'ai 2 soucis :
1. la suppresion des elements du fichier ne se fait pas.
2. l'ecriture dans le fichier xml se fait bien avec les données dans la table, mais pour chaque <album>, un element <image> avec des attributs vides est ajouté. J'ai beau regarder le code, je ne vois rien qui cloche. Si tu as une idée... merci d'avance.

function writexml(){
   require "cfg_config.php";
   $dom = new DomDocument();
   $dom->load("../galeries/Gallery.xml");
   $albumsnode = $dom->getElementsByTagName('albums')->item(0);
   $albumstodelete = $dom->getElementsByTagName('album');
   // donc a partir de là la suppression ne semble pas marcher
   foreach($albumstodelete as $album) $albumsnode->removeChild($album);
   $dom->save("../galeries/Gallery.xml"); // j'ai essayé de sauver le fichier
   // puis de le rouvrir...
   $dom = new DomDocument();
   $dom->load("../galeries/Gallery.xml");
   // on recupere toutes les infos de la table et on réécrit le fichier entierement
   $db = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die ("Impossible de se connecter : " . mysql_error());
   mysql_select_db($cfgBase,$db);
   $query = "SELECT * FROM w_albums";
   $send = mysql_query($query, $db) or die('Erreur SQL !<br />'.$query.'<br />'.mysql_error());
 
   while($data = mysql_fetch_array($send)){
      $nomalbum = $data['nomalbum'];
      $descriptionalbum = $data['descriptionalbum'];
      $lienlogo = $data['lienlogo'];
      $lienphoto1 = $data['lienphoto1'];
      $legende1 = $data['legende1'];
     
      $nouvelalbum = $dom->createElement("album");
      $nouvelalbum->setAttribute("icon" , $lienlogo);
      $nouvelalbum->setAttribute("thumbnailsFolder" , "galeries/".$nomalbum."/pictos/");
      $nouvelalbum->setAttribute("imagesFolder" , "galeries/".$nomalbum."/images/");
      $nouvelalbum->setAttribute("description" , $descriptionalbum);

      $photo1 = $dom->createElement("image");
      $nomphoto1 = substr($lienphoto1, -5);
      $photo1->setAttribute("name",$nomphoto1);
      $photo1->setAttribute("description"," : ".$legende1);
      $photo1->setAttribute("thumbnail",$nomphoto1);

      if ($data['lienphoto2']!="") {
          $nomphoto2 = substr($data['lienphoto2'], -5);
          $photo2 = $dom->createElement("image");
          $photo2->setAttribute("name",$nomphoto2);
          $photo2->setAttribute("description"," : ".$data['legende2']);
          $photo2->setAttribute("thumbnail",$nomphoto2);
      }

      $nouvelalbum->appendChild($photo1);
      if (isset($nomphoto2)) { $nouvelalbum->appendChild($photo2); }

      $albums = $dom->getElementsByTagName("albums")->item(0);
      $albums->appendChild($nouvelalbum);
   } // fin du while
   $dom->save('../galeries/Gallery.xml');
}

 

et donc dans le fichier xml j'ai systematiquement :

<albums>
<album icon="galeries/logos_clients/logo_client1.jpg" thumbnailsFolder="galeries/client1/pictos/" imagesFolder="galeries/client1/images/" description="client 1">
<image name="1.jpg" description=" : legende de la photo 1" thumbnail="1.jpg"/>
<image name="2.jpg" description=" : legende de la photo 2" thumbnail="2.jpg"/>
<image name="" description=" : " thumbnail=""/>
</album>
</albums>

 

Hors ligne

#4 18-10-2010 17:02:07

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Ecriture d'un fichier xml

jette un oeil et tu verras comment générer du html proprement

a++

Hors ligne

#5 18-10-2010 17:14:40

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Ecriture d'un fichier xml

salut,
a premiere vue ca me paraissait un peu éloigné du sujet ton topic, bon en fait j'ai vu que non, mais franchement je ne vais me prendre la tete pour des histoires de saut de ligne. Par contre si tu as une reponse à mon 2e post, je suis preneur.

Hors ligne

#6 19-10-2010 02:47:43

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Ecriture d'un fichier xml

Saluton,
Je trouve le code plus clair comme ceci

<?php
      $photo1 = $dom->createElement("image");
      $nomphoto1 = substr($lienphoto1, -5);
      $photo1->setAttribute("name",$nomphoto1);
      $photo1->setAttribute("description"," : ".$legende1);
      $photo1->setAttribute("thumbnail",$nomphoto1);
      $nouvelalbum->appendChild($photo1);
      if ($data['lienphoto2']!="") {
          $nomphoto2 = substr($data['lienphoto2'], -5);
          $photo2 = $dom->createElement("image");
          $photo2->setAttribute("name",$nomphoto2);
          $photo2->setAttribute("description"," : ".$data['legende2']);
          $photo2->setAttribute("thumbnail",$nomphoto2);
          $nouvelalbum->appendChild($photo2);
      }

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#7 19-10-2010 09:00:12

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Ecriture d'un fichier xml

oui c'est vrai. merci de cette optimisation. par contre, j'ai toujours les deux problemes de suppression qui ne se fait pas et de noeud vide. Une idée ?

Hors ligne

#8 19-10-2010 13:48:16

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Ecriture d'un fichier xml

Pour préserver la mise en forme de l'arbre xml, il ya deux lignes à ajouter à l'ouverture du fichier :


$dom = new DomDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load("../galeries/Gallery.xml");
 

Par contre toujours pas de solution pour ma suppression qui marche pas et mon noeud vide qui s'ajoute. Quelqu'un ?

Hors ligne

#9 19-10-2010 14:35:30

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Ecriture d'un fichier xml

J'avance... désolé si je poste les choses en cours d'avancement...
mon 2e probleme : la generation de noeud vide ne se fait plus. Ca ne peut qu'etre du à
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
vu que ce sont les seules modifs que j'ai faites. Je comprends pas, mais bon. C'est peut-etre un bug une subtilité de DOM
Quant à la suppression, en fait seul le premier noeud <album> est supprimé. Je pensais qu'avec foreach la suppression se ferait en boucle sur les elements mais apparemment non.
Donc ca redevient un bete probleme de boucle qui ne marche pas. Alors si quelqu'un pouvait m'aider ca serait vraiment sympa. Merci

Je redonne mon code :


function writexml()
{
require "cfg_config.php";

$dom = new DomDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load("../galeries/Gallery.xml");
//$albumsnode = $dom->getElementsByTagName("albums")->item(0);
$albumstodelete = $dom->getElementsByTagName("album");
foreach($albumstodelete as $album) { $album->parentNode->removeChild($album); } // ca ne supprime que le premier <album> et je voudrais que ca les supprime tous

// on recupere toutes les infos de la table et on réécrit le fichier entierement

$db = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die ("Impossible de se connecter : " . mysql_error());
mysql_select_db($cfgBase,$db);
$query = "SELECT * FROM w_albums";
$send = mysql_query($query, $db) or die('Erreur SQL !<br />'.$query.'<br />'.mysql_error());
 
while($data = mysql_fetch_array($send))
{
$nomalbum = $data['nomalbum'];
$descriptionalbum = $data['descriptionalbum'];
$lienlogo = $data['lienlogo'];
$lienphoto1 = $data['lienphoto1'];
$legende1 = $data['legende1'];

$nouvelalbum = $dom->createElement("album");
$nouvelalbum->setAttribute("icon" , $lienlogo);
$nouvelalbum->setAttribute("thumbnailsFolder" , "galeries/".$nomalbum."/pictos/");
$nouvelalbum->setAttribute("imagesFolder" , "galeries/".$nomalbum."/images/");
$nouvelalbum->setAttribute("description" , $descriptionalbum);

$photo1 = $dom->createElement("image");
$nomphoto1 = substr($lienphoto1, -5);
$photo1->setAttribute("name",$nomphoto1);
$photo1->setAttribute("description"," : ".$legende1);
$photo1->setAttribute("thumbnail",$nomphoto1);
$nouvelalbum->appendChild($photo1);

if ($data['lienphoto2']!="") {
$nomphoto2 = substr($data['lienphoto2'], -5);
$photo2 = $dom->createElement("image");
$photo2->setAttribute("name",$nomphoto2);
$photo2->setAttribute("description"," : ".$data['legende2']);
$photo2->setAttribute("thumbnail",$nomphoto2);
$nouvelalbum->appendChild($photo2);
}

$albumsnode = $dom->getElementsByTagName("albums")->item(0);
$albumsnode->appendChild($nouvelalbum);

} // fin du while
$dom->save("../galeries/Gallery.xml");
}

 

Le fichier XML est comme ca :

<albums>
    <album icon="galeries/logos_clients/logo_client1.jpg" thumbnailsFolder="galeries/client1/pictos/" imagesFolder="galeries/client1/images/" description="premier client">
      <image name="1.jpg" description=" : quelle belle image 1" thumbnail="1.jpg"/>
    </album>
    <album icon="galeries/logos_clients/logo_client2.jpg" thumbnailsFolder="galeries/client2/pictos/" imagesFolder="galeries/client2/images/" description="deuxieme client">
      <image name="1.jpg" description=" : quelle belle image !" thumbnail="1.jpg"/>
    </album>
</albums>

Hors ligne

#10 19-10-2010 15:12:07

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Ecriture d'un fichier xml

Je trouve ceci dans les commentaires de la doc PHP

Note that when using getElementsByTagName that it is a dynamic list. Thus if you have code which adjusts the DOM structure it will change the results of the getElementsByTagName results list.

The following code iterates through a complete set of results and changes them all to a new tag:

<?php
 $nodes = $xml->getElementsByTagName ("oldtag");

 $nodeListLength = $nodes->length; // this value will also change
 for ($i = 0; $i < $nodeListLength; $i ++)
 {
    $node = $nodes->item(0);

    // some code to change the tag name from "oldtag" to something else
    // e.g. encrypting a tag element
 }
?>

Since the list is dynamically updating, $nodes->item(0) is the next "unchanged" tag.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#11 19-10-2010 15:57:16

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Ecriture d'un fichier xml

Merci. je comprends qu'il faut donc aller chercher les elemùents un par un. Mais pour mon probleme ca ne peut pas marcher, étant donné que mon noeud doit s'appeler <album>.
J'ai essayé ca et evidemment ca ne marche pas :


$dom = new DomDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load("../galeries/Gallery.xml");
//$albumsnode = $dom->getElementsByTagName("albums")->item(0);
$albumstodelete = $dom->getElementsByTagName("album");
$albumstodeleteListLength = $albumstodelete->length;
for ($i = 0; $i < $albumstodeleteListLength; $i ++)
{
$album = $albumstodelete->item(0);
$dom->createElement("album");
 }

foreach($albumstodelete as $deletealbum) { $deletealbum->parentNode->removeChild($deletealbum); }

 

Donc je vais contourner le probleme et détruire <albums>. Puis je le recréerais. Je vois pas comment faire autrement.
Merci en tout cas.

Hors ligne

#12 19-10-2010 17:06:20

fanch75
Membre
Inscription : 14-05-2009
Messages : 47

Re : Ecriture d'un fichier xml

Le probleme est réglé en détruisant <albums>, mais à nouveau un noeud <image> vide est créé dans chaque <album>. Je n'y comprends plus rien... je vais dormir...

Hors ligne

Pied de page des forums