Vous n'êtes pas identifié(e).
Pages :: 1
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 :
$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) :
Tout ca sur une seule ligne... donc bon, ca marche, mais ce n'est pas tres esthetique...
Hors ligne
Saluton,
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
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
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
Saluton,
Je trouve le code plus clair comme ceci
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
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
Pour préserver la mise en forme de l'arbre xml, il ya deux lignes à ajouter à l'ouverture du fichier :
Par contre toujours pas de solution pour ma suppression qui marche pas et mon noeud vide qui s'ajoute. Quelqu'un ?
Hors ligne
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 :
$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 :
Hors ligne
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
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 :
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
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
Pages :: 1