Page 1 sur 1

[DOM] recuperer la valeur de l index d'un DOMNode

Posté : 13 juil. 2005, 15:51
par jckfun
Bonjour tout le monde !

Je n'ai toujours pas trouvé une solution pour supprimer un noeud dans un fichier XML.

Voici le products_test.xml que je veux editer :

Code : Tout sélectionner

<?xml version='1.0'?> <chambre> <armoire> <tiroir>feuilles</tiroir> </armoire> <armoire> <tiroir>crayons</tiroir> </armoire> <armoire> <tiroir>gommes</tiroir> </armoire> </chambre>
En fait je veux supprimer le noeud <armoire> contenant le noeud fils <tiroir>gommes</tiroir>. Je ne sais pas comment obtenir l'index du noeud parent au noeud <tiroir>gommes</tiroir>.

Voici mon script :
$db = new DomDocument;
$db->preserveWhiteSpace = false;
$db->formatOutput = true;
$db->load("products_test.xml");

$chambre = $db->documentElement;	
$noeuds_armoire = $chambre->childNodes;
$noeuds_tiroirs = $noeuds_armoire->item(0)->childNodes;	

$tiroirs = $chambre->getElementsByTagName('tiroir');
	foreach ($tiroirs as $tiroir){
		print $tiroir->nodeName . "\n" . "<br>";
		if ($tiroir->firstChild->nodeValue == "gommes"){
			$noeud_parent = $tiroir->parentNode->????getIndex????;
			print "noeud parent du noeud contenant feuille: $noeud_parent <br>";
$chambre->removeChild($noeuds_armoire->item($noeud_parent));	
		}
	}
En fait, je ne sais pas comment recupere l'index d'un noeud particulier ...

J'ai essayé ca, mais ... ca ne marche pas :
$noeud_parent = $tiroir->parentNode->????getIndex????;
			$chambre->removeChild($noeuds_armoire->item(??? variable that holds the index));
J'ai essayé de faire ca "a la main" en donnant l'index du noeud a supprimer (ex : 2) et cela marche tres bien.

Avez vous une idée de comment resoudre mon probleme ?

Merci d'avance et bon week end !

Posté : 13 juil. 2005, 18:58
par fggdm
Salut,

Il y a un type d'attribut "ID" en XML.
http://blog.bitflux.ch/wiki/GetElementById_Pitfalls

exit

Posté : 13 juil. 2005, 20:17
par jckfun
Merci de ta réponse !

Je ne peux pas utiliser cette fonction car mon fichier XML est structuré sans attributs dans les balises.

Je suis donc obligé de trouver une autre méthode pour séléctionner un noeud armoire contenant un fils avec le contenu chaussettes parmis plein d occurences existantes ...

ex :

Code : Tout sélectionner

<chambre> <armoire> <tiroir>chaussettes</tiroir> </armoire> <armoire> <tiroir>tshirts</tiroir> </armoire> </chambre>
Je ne vois toujours pas de solutions pour le moment. En effet, la liste de Noeud contient differents noeuds dont la seule facon de les ditinguer est par leur index ...

A bientot

Une idée ?? :)[/code]

Posté : 13 juil. 2005, 20:35
par fggdm

Posté : 13 juil. 2005, 22:39
par Invité
Oui merci de ce remarquable lien, j'avais qd meme compris qu'il était possible d'attaquer un noeud en specifiant son item.

Le probleme etant que je ne connais pas l item du noeud et que c est cela que je cherche ... :shock:

Un développeur de Zend.com a repondu a ma requete :

http://www.zend.com/phorum/read.php?num ... hread=2677

Posté : 14 juil. 2005, 05:00
par fggdm
Bonjour la solution ! Je ne vois pas en quoi il utilise des index ? Si tu as un fichier XML avec 50 tiroirs avec 50 objets différents, tu vas écrire 50 conditions if() ?!

De plus sur le forum de Zend tu précises que tu utilises PHP 5, et à mon avis il y a d'autres outils que DOM ou bien c'est une contrainte et tu n'as pas le choix ?