problème méthode last child

Petit nouveau ! | 6 Messages

10 févr. 2008, 17:21

Bonjour,
j'ai un soucis pour parcourir mon fichier xml avec php5, il faut que je retourne l'id du dernier enfant mais je n'arrive pas à arriver jusqu'à lui....

voici mon xml :

Code : Tout sélectionner

<?xml version="1.0"?> <IMAGES> <img id="001"> <urlImageMin>min001</urlImageMin> <urlImageGde>gde001</urlImageGde> </img> <img id="002"> <urlImageMin>min002</urlImageMin> <urlImageGde>gde003</urlImageGde> </img> <img id="003"> <urlImageMin>min003</urlImageMin> <urlImageGde>gde003</urlImageGde> </img> </IMAGES>
et mon code php :

Code : Tout sélectionner

$dom = new DomDocument(); if (!$dom->load('diapo.xml')) { echo"ouvrir xml NOK"; } else { $racine = $dom->documentElement; $last= $racine -> lastChild; if ($last -> hasAttribute("id")) { echo " - " . $last->getAttribute("ID"); }
je ne suis pas sure du tout de la fin du code php, le message d'erreur que j'obtiens est Fatal error: Call to undefined method DOMText::hasAttribute() in ....url fichier...

Pouvez vous m'aider svp...

Mammouth du PHP | 19672 Messages

10 févr. 2008, 17:28

Essaye en respectant la casse : dans un premier temps tu écris "id" et ensuite "ID" : avec certains systèmes, c'est suffisant pour planter :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 6 Messages

10 févr. 2008, 17:37

oui désolée, j'ai changé mon xml entre temps. En fait je ne vois pas quand est ce qu'il faut que je récupère le lastchild, car j'ai mon getAttribute ne marche que lorsque je fais :

Code : Tout sélectionner

$listeImg = $racine->getElementsByTagName("img"); foreach($listeImg as $img) { if ($img->hasAttribute("id")) { echo " - " . $img->getAttribute("id"); } echo "<br />"; }
il me donne une liste avec mes id, et si je veux récupérer le lastchild et y appliquer le getAttribute donc sans boucle puisque théoriquement il n'y en a qu'un j'ai le message d'erreur evoqué au dessus....
est ce que je dois récupérer le lastchild avant le getattribute ou est ce que je sélectionne le plus grand des mes attributs id pour avoir le dernier ?
la première solution parait plus simple ..mais je n'y arrive pas.

je sais pas si je suis très clair, au risque de me répéter je voudrai sélectionner le dernier <img id=".."> et récupérer son id..ensuite

ViPHP
ViPHP | 928 Messages

10 févr. 2008, 18:29

Normalement le lastChild s'applique à un ensemble du même type d'élément, donc tu dois comme ceci :

Code : Tout sélectionner

$last = $racine->img->lastChild;

Petit nouveau ! | 6 Messages

10 févr. 2008, 18:38

merci genova de ta réponse, ce que tu m'as donné me remonte des erreurs :

Notice: Undefined property: DOMElement::$img in C:\Program Files\EasyPHP 2.0b1\www\AMANDINE\gdeimage.classe.php on line 28

Notice: Trying to get property of non-object in C:\Program Files\EasyPHP 2.0b1\www\AMANDINE\gdeimage.classe.php on line 28


$last = $racine->img->lastChild;
je ne comprend pas on peut mettre img (nom de ma balise) comme ça ? je ne dois pas faire un getElementsByTagName("img") ?

ViPHP
ViPHP | 928 Messages

10 févr. 2008, 19:16

Ah si effectivement tu dois faire un getElementsByTagName("img") je m'emmêlais les pinceaux avec simpleXML.

Ce que je voulais dire, c'est que lastChild te donnera la dernière itération d'une image, donc ça s'applique à la balise image et non pas à la racine.

Petit nouveau ! | 6 Messages

10 févr. 2008, 19:26

ok j'essais :

$listeImg = $racine->getElementsByTagName("img");
$last = $listeImg ->lastChild;

mais ça me remonte : Notice: Undefined property: DOMNodeList::$lastChild in ....

idem si je fais $last = $racine->childNodes->lastChild;

(grrrrr en plus c'est un truc surement tout con, mais tous ce que je trouve sur le net ne marche pas pour moi

:( )

ViPHP
ViPHP | 928 Messages

10 févr. 2008, 20:09

J'avoue être complètement embrouillé aussi. Essaie de regarder des tutoriels DOM avec PHP5, par exemple : http://eusebius.developpez.com/php5dom/

Petit nouveau ! | 6 Messages

10 févr. 2008, 20:11

lol, c'est entre autre avec ça que je travail depuis le début...mon cas est crois tu désespéré ?

ViPHP
ViPHP | 928 Messages

10 févr. 2008, 20:56

Non non c'est vraiment simple ce que tu veux faire en plus ^^

Sinon bosse avec SimpleXML, pour ton code :
<?php
$xml = simplexml_load_file('test.xml');

// Pointe sur ta liste d'images
$img = $xml->img;

// Tu veux accéder au dernier élément de ta liste (tableau), d'où le count() - 1
$last_id = $img[count($img) - 1]['id'];

echo $last_id;
?>
Tu peux même le condenser en deux ligne :
<?php
$xml = simplexml_load_file('test.xml');
$last_id = $xml->img[count($xml->img) - 1]['id'];
?>
http://fr3.php.net/manual/fr/ref.simplexml.php

Petit nouveau ! | 6 Messages

10 févr. 2008, 21:13

hiAAAAAAAAAAaaa

tu gères, j'aurai jamais penser faire comme ça j'étais partie dans les dom ...
ça fait depuis le début de l'aprèm que je suis la dessus je te remercie vraiment bcp !!! 8-)

youpi !

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

10 févr. 2008, 22:14

Modération :
laureline, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 févr. 2008, 22:42

Autre point intéressant en faveur de SimpleXML, c'est que pour DOM, le lastChild de ton nœud-racine ce n'est pas le dernier nœud img mais la ligne que tu as sauté entre </img> et </IMAGES>. Les espaces et sauts de lignes sont des nœuds de type DOMText.