Page 1 sur 1
problème méthode last child
Posté : 10 févr. 2008, 17:21
par laureline
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...
Posté : 10 févr. 2008, 17:28
par Cyrano
Essaye en respectant la casse : dans un premier temps tu écris "id" et ensuite "ID" : avec certains systèmes, c'est suffisant pour planter

Posté : 10 févr. 2008, 17:37
par laureline
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
Posté : 10 févr. 2008, 18:29
par Genova
Normalement le lastChild s'applique à un ensemble du même type d'élément, donc tu dois comme ceci :
Posté : 10 févr. 2008, 18:38
par laureline
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") ?
Posté : 10 févr. 2008, 19:16
par Genova
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.
Posté : 10 févr. 2008, 19:26
par laureline
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

)
Posté : 10 févr. 2008, 20:09
par Genova
J'avoue être complètement embrouillé aussi. Essaie de regarder des tutoriels DOM avec PHP5, par exemple :
http://eusebius.developpez.com/php5dom/
Posté : 10 févr. 2008, 20:11
par laureline
lol, c'est entre autre avec ça que je travail depuis le début...mon cas est crois tu désespéré ?
Posté : 10 févr. 2008, 20:56
par Genova
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
Posté : 10 févr. 2008, 21:13
par laureline
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 !!!
youpi !
Posté : 10 févr. 2008, 22:14
par Truc
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
en haut à gauche de ce sujet.
Posté : 10 févr. 2008, 22:42
par Hubert Roksor
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.