Page 1 sur 2
modifier un fichier XML
Posté : 27 juil. 2007, 19:35
par regne
bonjour,
je cherche a modifier un fichier .XML...
En faite je cherche a modifier une ligne de mon fichier, la ligne varie selon $numero
voila ou j'en suis :
$ligne=($numero+8)*4096;
//creation du contenu
$title=$_POST['title'];
$contenu='<img src="accueil/img/'.$_POST['numero'].'.jpg" title="'.$title.'" />';
//ecriture dans fichier xml
$fp = fopen("/var/www/vhosts/gouniot.fr/httpdocs/accueil/dewslider.xml","w"); // 1.On ouvre le fichier en lecture/Ècriture
fseek($fp,$ligne); // 4.On se place en dÈbut de fichier
fputs($fp,$contenu); // 5.On Ècrit dans le fichier le contenu RSS
fclose($fp);
ma variable $numero est egale a un chiffre entre 1 et 5
Pour mieux comprendre je post l'ensemble du fichier xml
Code : Tout sélectionner
<?xml version="1.0" ?>
<album
showbuttons="no"
showtitles="yes"
randomstart="yes"
timer="5"
aligntitles="bottom"
alignbuttons="bottom" >
<img src="accueil/img/1.jpg" title="" />
<img src="accueil/img/2.jpg" title="" />
<img src="accueil/img/3.jpg" title="" />
<img src="accueil/img/4.jpg" title="" />
<img src="accueil/img/5.jpg" title="" />
</album>
en faite j'essaye de trouver la ligne qu'il faut modifier et jessaye de la remplacer par mon $contenu
Le probleme c'est que a chaque essaie je me retrouve avec un fichier xml contenant just ma ligne de la variable $contenu...
Est ce que quelqu'un peut m'expliquer comment je dois faire pour remplacer seulement la ligne que je desire ??
Merci d'avance
Posté : 27 juil. 2007, 21:30
par Sékiltoyai
Il faut te documenter avant d'utiliser une fonction à la légère. Si tu regardes la doc de fopen(), si tu utilises le mode "w", tu réduis ton fichier à 0. Il faut déjà, que tu utilise un mode qui ne détruit pas le fichier.
Posté : 28 juil. 2007, 02:47
par regne
Désolé j'aurai du plus regarder la doc...
je pensé que ca venait de mon code...
la j'ai reussi a ajouter la ligne que je veux mais en fin de fichier.
Est ce que tu pourrait m'aiguiller sur le calcul de ligne pour bien choisir l'emplacement?
est ce que une ligne = 4096 caractere?
Merci
Posté : 28 juil. 2007, 11:41
par Sékiltoyai
Est ce que tu pourrait m'aiguiller sur le calcul de ligne pour bien choisir l'emplacement?
est ce que une ligne = 4096 caractere?
Non, 4096 caractères, c'est 4096 caractères.
Une nouvelle ligne en elle même, c'est un seul caractère, dans le sens où tu as juste besoin d'un caractère pour sauter à la ligne.
Pour le calcul, je verrais après manger.
Posté : 28 juil. 2007, 13:02
par regne
j'ai lue que pour aller a la ligne il fallait mettre \n, mais je pense que c'est juste pour ecrire ca...
Pour le calcul, je verrais après manger.
merci et bonne apetit !
Posté : 28 juil. 2007, 13:03
par Truc
Je pense que tu peux utiliser ce qui est prévu
pour le xml
Posté : 29 juil. 2007, 16:39
par regne
Salut,
Merci pour les reponses !
j'ai lu ce que vous m'avez envoyé et je suis un peu perdu... je ne sais pas comment proceder..
En faite le XML sert a une galerie flash toute faite, je n'ai pas le .FLA donc je ne peux pas modifier le nom du fichier xml apelé...
Donc si j'ai bien compris pour utiliser SimpleXML ce n'est pas possibles, il faudrait que mon xml soit en .php ?
le mieux je pense serai que j'arrive a utiliser la systeme que j'ai poster en haut de page mais qu'il me calcul bien la ligne a remplacer...
j'ai chercher et je ne trouve pas comment calculer la ligne... y a t il un moyen de compter les ligne et de remplacer la 9eme ou la 10eme selon le cas ?
merci
Posté : 29 juil. 2007, 16:49
par Sékiltoyai
Non, pour utiliser simpleXML, tu charges le fichier distant avec simplexml_load_file() et tu le traites avec les fonctions SimpleXML. Il n'y a aucune difficulté et si tu peux récupérer le fichier par fopen(), tu peux le charger dans simpleXML.
Posté : 30 juil. 2007, 11:42
par regne
salut,
je suis toujours en galere avec ce xml...
j'ai fait :
if (file_exists('../accueil/dewslider.xml')) {
$xml = simplexml_load_file('../accueil/dewslider.xml');
var_dump($xml);
} else {
exit('Echec lors de l\'ouverture du fichier ../accueil/dewslider.xml.');
}
foreach ($xml->img[0]->title as $origine_title) {
echo $origine_title;
}
et biensure ca ne marche pas...
voila ce qui s'affiche quand je charge la page :
object(SimpleXMLElement)#1 (1) { ["img"]=> array(5) { [0]=> object(SimpleXMLElement)#2 (0) { } [1]=> object(SimpleXMLElement)#3 (0) { } [2]=> object(SimpleXMLElement)#4 (0) { } [3]=> object(SimpleXMLElement)#5 (0) { } [4]=> object(SimpleXMLElement)#6 (0) { } } }
et mon echo n'affiche rien...
Posté : 30 juil. 2007, 12:32
par Truc
il n'y a pas de valeur pour l'attribut "title" dans le xml montré.
Posté : 30 juil. 2007, 12:53
par regne
d'accord, mais alors sur quoi je peux me basé pour essayer de modifier le xml ?
Tu veux dire que la balise title"" est vide, ou que je ne peux pas utiliser title ?
car pour mes essaie j'ai rempli les balise title...
Posté : 30 juil. 2007, 13:58
par Truc
pour accèder a ton attribut title tu aurais due faire :
foreach ($xml->img as $img)
{
echo "Title : ".$img['title']." <br/>";
}
un sous tableau pour les attributs.
Un apercu pour supprimer un élément et créer un autre:
$xml = simplexml_load_file('../accueil/dewslider.xml');
unset($xml->img[3] ); // supprime la 4ème balise img...
$img = $xml->addChild('img');
$img->addAttribute('src', 'new_img.jpg');
$img->addAttribute('title', 'new_title');
echo $xml->asXML('../accueil/dewslider.xml');
Sinon il y a aussi le dom (plus simple pour la "grosse" manipulation de xml)
$dom = new DOMDocument();
$dom->load('../accueil/dewslider.xml');
$imgs = $dom->getElementsByTagName('img');
foreach ($imgs as $img)
{
if($img->getAttribute("src") == "accueil/img/3.jpg" ) // nom de l'image
{
$img_element = $dom->createElement('img'); // création d'un nouveau noeud
$img_element->setAttribute("src", "accueil/img/6.jpg");
$img_element->setAttribute("title", "titre_6");
$img->parentNode->replaceChild($img_element,$img); //remplacement du noeud ayant comme attribut src "accueil/img/3.jpg"
}
}
echo $dom->save('../accueil/dewslider.xml');
à peu de choses près ça devrait être suffisant pour tes besoins
Posté : 30 juil. 2007, 14:56
par regne
Merci beaucoup !
Effectivement avec tes codes ca devrai aller...
Alors j'ai fait ca :
//calcul du numero de l'image
$num=($_POST['numero']-1);
$img2='img['.$num.']';
echo $img2;
//creation contenu title
$title=$_POST['title'];
//on recup le fichier
$xml = simplexml_load_file('../accueil/dewslider.xml');
unset($xml->$img2);// supprime la 4ème balise img...
$img = $xml->addChild('img');
$img->addAttribute('src', 'accueil/img/'.$newimg);
$img->addAttribute('title', $title);
echo $xml->asXML('../accueil/dewslider.xml');
et j'ai ce message
Code : Tout sélectionner
Fatal error: Call to undefined method SimpleXMLElement::addChild() in
J'ai regardé sur le net ca pourrait venir de mon serveur tu en pense quoi?
sur le net il dise :
SimpleXML accèpte addChild et addAttributes que dans sa version 1.151 livrée avec php 5.2
moi j'ai PHP 5.0.4 et simpleXML $Revision: 1.139.2.4 $
Posté : 30 juil. 2007, 15:44
par Hubert Roksor
Essaie de remplacer le code que tu as posté par ça
//calcul du numero de l'image
$num=($_POST['numero']-1);
//creation contenu title
$title=$_POST['title'];
//on recup le fichier
$xml = simplexml_load_file('../accueil/dewslider.xml');
unset($xml->img[$num]);// supprime la 4ème balise img...
$img = $xml->img[];
$img['src'] = 'accueil/img/'.$newimg;
$img['title'] = $title;
echo $xml->asXML('../accueil/dewslider.xml');
Au fait, plutôt que de détruire et recréer, vous avez essayé de modifier les données plutôt ?
$xml->img[$num]['src'] = 'accueil/img/'.$newimg;
$xml->img[$num]['title'] = $title;
Posté : 30 juil. 2007, 16:03
par Truc
sur le net il dise :
SimpleXML accèpte addChild et addAttributes que dans sa version 1.151 livrée avec php 5.2
moi j'ai PHP 5.0.4 et simpleXML $Revision: 1.139.2.4 $
En effet... tu peux t'en passer comme dans le code d'
Hubert
(des crochets en trop sur $xml->img[])
Au fait, plutôt que de détruire et recréer, vous avez essayé de modifier les données plutôt ?
Par étapes c'est mieux pour la compréhension...
(et j'ai pas d'excuses
)