modifier un fichier XML

Eléphant du PHP | 199 Messages

27 juil. 2007, 19:35

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

ViPHP
ViPHP | 5924 Messages

27 juil. 2007, 21:30

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.

Eléphant du PHP | 199 Messages

28 juil. 2007, 02:47

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

ViPHP
ViPHP | 5924 Messages

28 juil. 2007, 11:41

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.

Eléphant du PHP | 199 Messages

28 juil. 2007, 13:02

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 !

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 juil. 2007, 13:03

Je pense que tu peux utiliser ce qui est prévu pour le xml

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 199 Messages

29 juil. 2007, 16:39

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

ViPHP
ViPHP | 5924 Messages

29 juil. 2007, 16:49

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.

Eléphant du PHP | 199 Messages

30 juil. 2007, 11:42

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...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 juil. 2007, 12:32

il n'y a pas de valeur pour l'attribut "title" dans le xml montré.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 199 Messages

30 juil. 2007, 12:53

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...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 juil. 2007, 13:58

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 199 Messages

30 juil. 2007, 14:56

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 $

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 juil. 2007, 15:44

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;

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 juil. 2007, 16:03

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 :lol: )

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute