Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/09/2006, 13h28   #1
Invité de passage
 
Inscription : mars 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 10
Points : 1
Points : 1
Par défaut [DOM] Warning avec foreach

Bonjour a tous je travaille actuellement sur un site en php5 DOM et xml et j'ai le prob suivant :

Citation:
Warning: Invalid argument supplied for foreach() in /home.3/www/droite.php5 on line 164
Voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$dom = new DomDocument();
$xml="messages.xml";
$dom->load($xml);
$dom->validateOnParse = true;
 
$id = 10;
$id2= $id-4;
for($id ; $id > $id2 ; $id-- )
{
 	# Recherche du noeud message par idMax
  	$message = $dom->getElementById($id);
  	# Parcours de la liste enfants
  	$textes = $message->childNodes;
 
	foreach ( $textes as $texte) // Ligne 164 !!!
	{ 
		if( $texte->nodeName=="texte"){
		$max=50;
		$chaine=$texte->nodeValue;
		if(strlen($chaine)>=$max){$chaine=substr($chaine,0,$max);
		$espace=strrpos($chaine," ");
		$chaine=substr($chaine,0,$espace)."..."; }
		?>
		  <li> 
		  <a href="message.php5?id=<?php echo $id?>">
		  <font style="color:white;font-weight:normal">
		  <?php echo utf8_decode($chaine);?>
		  </font></a>
		  </li>
		<?php
		}
    }
}
Je n'arrive pas à l'enlever je ne vois pas ou le foreach pose probleme, pouvez vous m'eclairer svp ?

J'attend vos reponse avec impatience merci.
nico9135 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 13h36   #2
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Bonjour

childNodes() renvoie un objet DomNodeList.
Comme indiqué ici, cet objet n'est pas un tableau et ne peut donc être parcouru avec foreach.

Par contre, cet objet implémente l'interface Iterator, tu peux donc utiliser les méthodes current, next, key, valid et rewind.

Le tuto PHP5 DOM : http://eusebius.developpez.com/php5dom/
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 15h21   #3
Invité de passage
 
Inscription : mars 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 10
Points : 1
Points : 1
ok donc je dois utiliser l'interface Iterator mais je ne sais comment fonctionne une interface.

Pouvez me guider dans mon cas svp.
nico9135 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 15h30   #4
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par nico9135
ok donc je dois utiliser l'interface Iterator mais je ne sais comment fonctionne une interface.

Pouvez me guider dans mon cas svp.
Désolé, j'avais donné un mauvais lien.
La description de l'interface Iterator est ici : http://www.php.net/~helly/php/ext/sp...eIterator.html

Le fait que DomNodeList implémente l'interface Iterator veut dire qu'un certain nombre de méthodes (fonctions membres), au fonctionnement standard, sont disponibles pour ces objets.

Tu trouveras la description des fonctions current, next, key, valid et rewind dans la doc PHP. Ex http://fr.php.net/manual/fr/function.next.php
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 16h08   #5
Invité de passage
 
Inscription : mars 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 10
Points : 1
Points : 1
Voici mon le contenu de mon xml :
Code XML :
1
2
3
4
5
6
7
8
<messages>
 
<message id="1" date="Mercredi 30 Aout">
<titre>c'est l'école</titre>
<texte>genèse</texte>
<commentaire date="Vendredi 01 Septembre" auteur="jean" email="efef@efzef.com">ftout va bien ici c\'est la fete </commentaire>
</message>
</messages>

N'y a t'il pas moyen d'utiliser le methodes item(2) pour acceder au noeud enfant <texte>

en ecrivant ceci :
Code :
1
2
3
4
 
$message = $dom->getElementById('1');
$enfants= $message->childNodes;
$texte = $enfants->item(2);
Sinon j'ai compris les methodes next()... mais elles s'appliquent a des tableaux et donc comme vous l'avez dit plus haut childNodes n'est pas un tableau et donc je ne peux pas ecrire :
Code :
1
2
3
4
5
 
$message = $dom->getElementById($id);
$enfants= $message->childNodes;
for(restet($enfants);end($enfants);next($enfants))
{....}
Et je ne vois pas comment les exploiter avec Iterator...
nico9135 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 16h22   #6
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par nico9135
N'y a t'il pas moyen d'utiliser le methodes item()
Si bien sûr, si tu connais l'indice de ce que tu veux récupérer, c'est le plus simple.

Citation:
Envoyé par nico9135
Sinon j'ai compris les methodes next()... mais elles s'appliquent a des tableaux et donc comme vous l'avez dit plus haut childNodes n'est pas un tableau et donc je ne peux pas ecrire :
Ces fonctions s'appliquent à tout ce qui rentre dans la catégorie "Iterator". Les tableaux sont des "Iterator", les DomNodeList aussi. Mais les DomNodeList ne sont pas des tableaux.
C'est pourquoi on peut utiliser next et compagnie sur les tableaux ET sur les DomNodeList, mais on ne peut pas utiliser les DomNodeList comme des tableaux.
Les DomNodeLists ont des points communs avec les tableaux, mais n'en sont pas.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 16h38   #7
Invité de passage
 
Inscription : mars 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 10
Points : 1
Points : 1
Voila ce que j'ai ecris :

Code :
1
2
3
4
5
6
7
8
 
$dom = new DomDocument();
$xml="messages.xml";
$dom->load($xml);
$dom->validateOnParse = true;
$message = $dom->getElementById($id);
$textes = $message->childNodes;
$texte = $textes->item(2);
et voici ce que j'ai :

Citation:
Fatal error: Call to a member function item() on a non-object in /home.3/www/droite.php5 on line 163
Je rappel mon messages.xml :
Code :
1
2
3
4
5
6
7
<messages>
<message id="1" date="Mercredi 30 Aout">
<titre>c'est l'école</titre>
<texte>genèse</texte>
<commentaire date="Vendredi 01 Septembre" auteur="jean" email="efef@efzef.com">ftout va bien ici c\'est la fete </commentaire>
</message>
</messages>
nico9135 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 16h40   #8
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Que vaut $id ?
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 17h02   #9
Invité de passage
 
Inscription : mars 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 10
Points : 1
Points : 1
Excusez moi mais je ne voulais mettre tout le code alors j'ai oublier de modifier cette variable.

En fait elle vaut '1' c'est a dire la valeur de l'attribut id du noeud message dans l'xml.
nico9135 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 17h15   #10
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Tu peux faire un var_dump de $textes ?
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2006, 17h41   #11
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
si tu affiches tous les messages d'erreur, tu verras que tu as un notice à la ligne du childNodes :
Citation:
Notice: Trying to get property of non-object
Une cause possible : ton ID n'est pas définie proprement dans ta DTD.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2006, 18h17   #12
Invité de passage
 
Inscription : mars 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 10
Points : 1
Points : 1
Voici ce que j'ai lorsque je fais un var_dump($textes) :

Citation:
object(DOMNodeList)#6 (0) { } NULL NULL NULL
Et voic ma dtd :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE messages [
<!ELEMENT message (titre , texte)>
<!ATTLIST message id ID #REQUIRED>
<!ATTLIST message date CDATA #REQUIRED>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT texte (#PCDATA)>
<!ELEMENT photo (nom , commentaire)>
<!ATTLIST photo nom CDATA #REQUIRED>
<!ATTLIST photo commentaire CDATA #REQUIRED>
<!ELEMENT video (nom , commentaire)>
<!ATTLIST video nom CDATA #REQUIRED>
<!ATTLIST video commentaire CDATA #REQUIRED>
<!ELEMENT commentaire (date , auteur , email)>
<!ATTLIST commentaire date CDATA #REQUIRED>
<!ATTLIST commentaire auteur CDATA #REQUIRED>
<!ATTLIST commentaire email CDATA #REQUIRED>
]>
Que veux dire le resultat du var_dump et ma dtd est elle bonne?
nico9135 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2006, 20h50   #13
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par nico9135
ma dtd est elle bonne?
Vu de chez moi, non, ça ne valide pas.

Citation:
No declaration for element messages
Element message content does not follow the DTD, expecting (titre , texte), got (titre texte commentaire )
Syntax of value for attribute id of message is not valid
Element commentaire content does not follow the DTD, expecting (date , auteur , email), got (CDATA)
Bonne correction
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h43.


 
 
 
 
Partenaires

Hébergement Web