Update de fichier XML via php

Résolu/Fermé
Alexandre Carle - 12 mars 2008 à 15:02
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 - 5 janv. 2009 à 09:27
Bonjour,
Je fais un peu de programmation dans mes temps libres et j'ai un projet en cours dans lequel j'utilise une base de donnée XML. Du moins, j'essaie. Comme je ne connais pas du tout ça, j'ai d'abord commencé par le simpleXML, pour me rendre compte qu'il était incompatible avec les sessions. Puis, j'ai adopté une approche DOM php. J'utilise php 5.3.1 et jusqu'à présent je n'ai aucun problème pour aller chercher des données, mais je n'ai pas trouvé le moyen de les mettre à jour.

J'ai balayé le net et j'ai trouvé comme pistes principales les méthodes suivantes, seulement je me bute toujours à des erreurs du genre "Fatal error : method used on a non member ...", ou alors il ne se passe rien ... ou alors la mise à jour se fait uniquement sur les données extraites et ne se rend pas jusqu'à ma bd ...

J'ai essayé DOMElement->setAttribute($name, $value) et ça m'a donné une erreur, peu importe les syntaxes essayées.
- DOMNode->nodeValue = $value, semble fonctionner (quand je test DOMNode->nodeValue il me retourne la bonne valeur), mais en aucun cas la mise à jour est effectuée dans le document XML. J'ai pensé qu'il fallait faire un XMLDocument->saveXML(), mais ça n'a rien donné. Lorsque j'en fais un echo, ça me renvoit les valeurs initiales, aucun signe de mise à jour.

Bref, d'une part je ne suis pas un gourou du XML et d'autre part je suis bloqué à être incapable de mettre à jour ma BD. Si vous pouviez me filer un coup de main ce serait très apprécié !
A voir également:

5 réponses

Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 922
12 mars 2008 à 15:11
salut,

avec 'Document->createElement()' ou 'Document->createTextNode()' selon le besoin.

regarde ce tuto.
0
Alexandre Carle
12 mars 2008 à 15:44
Je me suis mal exprimé dans mon premier post. En réalité, j'aimerais mettre à jours les attributs d'éléments déjà existants.

Avec createElement, j'imagine que je pourrais toujours supprimer un élément, en créer un autre et l'envoyer le remplacer, mais à long terme, c'est une méthode très peu pratique puisqu'elle amène la suppression de tous les enfants et demande probablement plus de lignes de codes que nécessaire.
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 922
12 mars 2008 à 16:10
oups, non c'est moi qui me suis enflammé !

comme tu t'es tourné vers le DOM j'en ai déduit trop vite que tu voulais ajouter des nœuds…

et 'Element->setAttribute( 'name' , 'value' )' suivi d'un 'Document->save( 'file.xml' )' doit le faire.

il faut bien sélectionné le nœud.
as-tu essayé avec 'DOMXPath->query()' pour choper le nœud visé ?
0
Alexandre Carle
13 mars 2008 à 00:56
J'ai essayé de faire fonctionner le setAttribute à toutes les sauces et j'obtiens toujours le même message d'erreur :

Fatal error: Call to a member function saveAttribute() on a non-object in D:\domains\globe-technologies.com\wwwroot\alex\LGD\test.php on line 8

Voici le code source (un test en réalité, simplement pour réussir cerner comment mettre à jour) :

<?php
	
$xmlDoc = new DOMDocument();
$xmlDoc->load("XML/profils.xml");
$xml = $xmlDoc->documentElement;
foreach($xml->childNodes as $profils){
	if($profil->firstChild->nodeValue == 0){      // Note 1
		$profil->setAttribute("id", 10);        // Note 2
		$xmlDoc->save("XML/profils.xml");
	}
	break;
}
	
?>


Note 1 : essentiellement, ici je restreint ma mise à jour au premier profil, celui ayant l'ID 0. Évidemment, j'ai vérifié qu'il y avait une ID 0 et que le if passait.
Note 2 : aucun doute possible pour le nom du node.

Bref, mes noms sont les bons, les chemins d'accès sont aussi les bons et il n'y a pas d'erreur de syntaxe. Donc forcément, il y a un truc que je ne pige pas, ou que je comprends mal ...
0
Alexandre Carle > Alexandre Carle
13 mars 2008 à 00:59
Ah aussi, ça :

Fatal error: Call to a member function saveAttribute() on a non-object in D:\domains\globe-technologies.com\wwwroot\alex\LGD\test.php on line 8 


C'est le mauvais message d'erreur (enfin, remplacer "save" par "set" et c'est le bon), j'ai copié d'une autre fenêtre où j'avais essayé un nom de fonction que je savais inexistant, juste pour voir s'il affichait le même message d'erreur. Comme c'est le cas, je me dis que c'est peut-être une mauvaise syntaxe ? D'une version php à l'autre ça change beaucoup pour le DOM XML. Cela dit, pour le 5.0+ comme c'est mon cas, c'est généralement ce format qui est utilisé ...
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 922
13 mars 2008 à 09:39
salut,

foreach($xml->childNodes as $profils){
	if($profil->firstChild->nodeValue == 0){      // il sort d'où profil ? au dessus c'est $profils
		$profil->setAttribute("id", 10);       
		$xmlDoc->save("XML/profils.xml");
	}

en plus tu devrais tester avec le type et sur une chaine.
$profil->firstChild->nodeValue === '0'

0
Alexandre Carle
13 mars 2008 à 18:01
Et meeerde. C'était qu'une erreur de syntaxe. 'Faut que je me souvienne de celle-là -_-

Sinon, il suffit d'un simple :

$profils->firstChild->nodeValue = 10;
$xmlDoc->save("XML/profils.xml");


... pour modifier le document.

La fonction setAttribute fonctionne très bien, seulement ça donne plutôt <profil id="10">, ce qui n'est pas tout à fait le résultat escompté.

Dans tous les cas, merci beaucoup pour l'aide Mathieu/Dalida. C'est très apprécié =)

- Alex, un peu honteux ^^"
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 922 > Alexandre Carle
14 mars 2008 à 10:17
bon courage pour la suite !
-;o)

à plus !
0
bonjour ,
je survolais le forum et ton identité m'a interpelée car j'ai connu 1 ami militaire
se nommant pareil mais perdu de vu il y a klk années !!! il serait partit travaillé avec les ONG, serais tu cette personne ? sinon je ne suis pas tres technique en informatique donc je suis désolée de ne pouvoir t'aider.....disolée.....a bientot
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bonjour ,
je survolais le forum et ton identité m'a interpelée car j'ai connu 1 ami militaire
se nommant pareil mais perdu de vu il y a klk années !!! il serait partit travaillé avec les ONG, serais tu cette personne ? sinon je ne suis pas tres technique en informatique donc je suis désolée de ne pouvoir t'aider.....disolée.....a bientot
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 922
5 janv. 2009 à 09:27
salut,

je rêve…
tu t'es loupé, on est pas sur Copains d'Avant !

si tu veux contacter un utilisateur enregistré, clique sur son son pseudo tu arrivera au profil dudit membre, tu pourras lui écrire en privé.

bonne année !
0