8791 sujets

Développement web côté serveur, CMS

Bonjour à tous!
J'étais gentillement en train d'interpéter mon XML en php, quand j'ai eu recours à la fonction DOM : childNodes.
Il s'avère que tous les enfants récupérés sont à des indices impaires. Et les indices paires ne donnent rien.

Voici mon code php

function listage($xml)
			{		
				if( $xml->getElementsByTagName("rubrique")->length != 0 )
				{
					$list_tag = $xml->getElementsByTagName("rubrique");
					echo "<ul>";
					for( $i=0 ; $i<$list_tag->length  ; $i++ )
					{
						echo "<li>".$list_tag->item($i)->getElementsByTagName("titre")->item(0)->nodeValue."</li>";
						listage($list_tag->item($i)->getElementsByTagName("sousMenu")->item(0));
					}
					echo "</ul>";
				}
				else
				{
					$list_tag = $xml->getElementsByTagName("sousRubrique");
					if( $list_tag->length != 0 )
					{
						echo "<ul>";
						for( $i=0 ; $i<$list_tag->length ; $i++ )
						{
							echo "<li>".$list_tag->item($i)->getElementsByTagName("titre_subrub")->item(0)->nodeValue."</li>";
							$enfants = $list_tag->item($i)->childNodes;
echo $enfants->item(0)->nodeValue;							
echo $enfants->item(1)->nodeValue;
							//listage($list_tag->item($i)->lastChild);
						}
						echo "</ul>";
					}
					else
					{
						
					}
				}
			}
			
			$dom = new DomDocument();
			$xmlObject = "XML/rubriques.xml";
			$dom->load($xmlObject);
			listage($dom);


Voilà, ça me semble un peu bizarre.
Si quelqu'un a déjà rencontré ce soucis, ou voit une erreur dans mon code...
Merci
Salut,

Ca ne viendrait pas des espaces/retours a la ligne que tu as entre tes balises filles et qui sont considérés comme des DOMText avec un contenu vide ?

++
Tom
Je te remercie pour ta réponse.
Cependant, il ne semble pas que ce soit ça. Par contre c'est clair que j'ai des soucis avec les fonctions sur les "child".
Par exemple, voici (à nouveau) mon code php:

function listage($xml)
			{		
				if( $xml->getElementsByTagName("rubrique")->length != 0 )
				{					
					$list_tag = $xml->getElementsByTagName("rubrique");
					echo "<ul>";
					for( $i=0 ; $i<$list_tag->length  ; $i++ )
					{
						echo "<li class=\"liste_dossiers\"><a href=\"$PHP_SELF?url=".utf8_encode($list_tag->item($i)->getElementsByTagName("lien")->item(0)->nodeValue)."\">".$list_tag->item($i)->getElementsByTagName("titre")->item(0)->nodeValue."</a></li>";
						listage($list_tag->item($i)->getElementsByTagName("sousMenu")->item(0));
					}
					echo "</ul>";
				}
				else
				{
					$list_tag = $xml->getElementsByTagName("sousRubrique");
					if( $list_tag->length != 0 )
					{
						echo "<ul>";
						for( $i=0 ; $i<$list_tag->length ; $i++ )
						{
							echo "<li class=\"liste_dossiers\"><a href=\"$PHP_SELF?url=".utf8_encode( $list_tag->item($i)->getElementsByTagName("lien_subrub")->item(0)->nodeValue )."\">".$list_tag->item($i)->getElementsByTagName("titre_subrub")->item(0)->nodeValue."</li>";
							listage($list_tag->item($i));
						}
						echo "</ul>";
					}
					else
					{
						$list_tag = $xml->getElementsByTagName("repertoire");
						if( $list_tag->length != 0 )
						{
							//echo "j'ai des repertoires!!!";
							$dossiers = $list_tag->item(0)->childNodes;
							echo $dossier->length."coucou";
							
							echo "<ul>";
							for( $i=0 ; $i<$dossiers->length ; $i++ )
							{
								echo "<li class=\"liste_dossiers\">".$dossiers->item($i)->nodeValue."</li>";
							}
							echo "</ul>";
						}
					}
				}
			}

                        $dom = new DomDocument();
			$xmlObject = "XML/rubriques.xml";
			$dom->load($xmlObject);
			listage($dom);


et voici la capture correspondante:
upload/12862-enfants.jpg

Vous pourrez constater que dans mon code je lui demande en ligne 34 d'afficher la longueur de la liste des fils du noeud accroché au mot "coucou" pour qu'on le voit bien. Sauf que l'on ne voit rien du tout!
Et ensuite, dans le code, j'ai un "for" qui utilise la longueur de cette liste, et estime qu'elle a une taille de 7...

Enfin bon, je n'y comprend rien.
Voici aussi mon XML, au cas où:

<rubrique>
		<id>3</id>
		<titre>Documents Types</titre>
		<image>js/documents_types.png</image>
		<description>Accéder, consulter, déposer des documents types.</description>
		<lien>./contenu/Documents Types</lien>
		<sousMenu>
			<sousRubrique>
				<id_subrub>1</id_subrub>
				<titre_subrub>Foncier</titre_subrub>
				<lien_subrub>./contenu/DocumentsTypes/Foncier</lien_subrub>
			</sousRubrique>
			<sousRubrique>
				<id_subrub>2</id_subrub>
				<titre_subrub>Marchés</titre_subrub>
				<lien_subrub>./contenu/Documents Types/Marchés</lien_subrub>
				<repertoire>
					<dossier><titre_dossier>Marchés privés</titre_dossier></dossier>
					<dossier><titre_dossier>Marchés publics</titre_dossier></dossier>
					<dossier><titre_dossier>Marchés sous ordonnance 2005</titre_dossier></dossier>
				</repertoire>
			</sousRubrique>
			<sousRubrique>
				<id_subrub>3</id_subrub>
				<titre_subrub>Réponses de S93</titre_subrub>
				<lien_subrub>./contenu/Documents Types/Réponses de S93</lien_subrub>
			</sousRubrique>
		</sousMenu>
	</rubrique>


Merci d'avance
Personne n'a de solution ? Smiley bawling
Bon en tous cas j'ai essayé de simplifier le problème, et il m'a fallu tout reprendre à zéro.
J'ai donc ce xml:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<menu>
	<sousmenu>
		<texte>monTexte1</texte>
	</sousmenu>
	<sousmenu>
		<texte>monTexte1</texte>
	</sousmenu>
</menu>


et le code php suivant:

function listage($xml)
			{
				$liste_menu = $xml->getElementsByTagName("menu");
				$menu = $liste_menu->item(0);
				$enfant = $menu->firstChild;
				echo $menu->nodeName;
				echo $enfant->nodeName;
			}
			
			$dom = new DomDocument();
			$xmlObject = "XML/essai.xml";
			$dom->load($xmlObject);
			listage($dom);


le résultat est assez impressionant puisqu'il m'affiche correctement le nom du premier noeud : menu, mais lorsque je passe au fils il m'aafiche : #text.
C'est assez bizarre, qu'en pensez-vous?
Si quelqu'un passe par là et qu'il a une petite solution, il est le très bienvenue... Smiley biggrin
salut ,

ce n'est pas la solution que t'as proposé blaaaaaaah :
a écrit :


Ca ne viendrait pas des espaces/retours a la ligne que tu as entre tes balises filles et qui sont considérés comme des DOMText avec un contenu vide ?


il me semble bien que cest ce noued blanc (white space) qui est ton problème
Salut,
j'avais pourtant essayé la proposition de blaaaaaaah. Je l'essaierais à nouveau quand j'aurais le temps.
Parce que finalement, j'ai testé simpleXML, et il s'avère que c'est extrêmement simple, intuitif et que ça marche...

Donc bon je reviendrais quand même pour dire si la solution de blaaaaaaah est bien la bonne.

Merci de vous être penchés sur le problème en tous cas Smiley cligne