Problème pour lire certains élements d'un fichier xml en php

Moutyk
Invité n'ayant pas de compte PHPfrance

03 déc. 2006, 12:49

Bonjour,

A coup sûr je suis sur le bon forum !!! :D

Je rencontre quelques difficultées pour lire certains éléments d'un fichier XML en php (php4)

Le but est de réupérer les élements de ce fichier xml pour les injecter dans une table mysql.

J'ai récupéré un script sur internet assé simple avec lequel j'arrive sans trop de difficulté a récupérer les premiers élements (1er niveau?)

Pour le reste impossible d'afficher quoique ce soit cela fait deux jours que je suis dessus sans succés, j'ai acheter un bouquin php qui explique assé bien comment récupérer tous les éléments et leurs valeurs seulement sur php5 ...

Ci-dessous un extrait du fichier xml, je souhaiterais récupérer les élements photos de chaque bien ainsi que "ltitre" et "lannonceweb"

-

Code : Tout sélectionner

<bien> <nbien>1</nbien> <cagence>demo</cagence> <cbien>005</cbien> <mprix>225000</mprix> <ctyp>ma</ctyp> <nannee>1875</nannee> <qsurfterrain>2500</qsurfterrain> <cetat>+</cetat> <qchambres>3</qchambres> <qpieces>6</qpieces> <qsurfhab>140</qsurfhab> <qsurfsejour>35</qsurfsejour> <cregion>3</cregion> <cenvironnement>cpni</cenvironnement> <ctypmandat>v</ctypmandat> <ndisponibilite>1</ndisponibilite> <lcp>24150</lcp> <llocalite>BAYAC</llocalite> <cisopays>FRA</cisopays> <nnatmandat>2</nnatmandat> <cnaturebien>res</cnaturebien> - <lvue> - <![CDATA[ S ]]> </lvue> <qsdb>1</qsdb> <qsdd>1</qsdd> <qgarages>1</qgarages> <nanneerenov>1986</nanneerenov> - <cchauf> - <![CDATA[ BF ]]> </cchauf> <ntypcuisine>6</ntypcuisine> <mrevcad>950</mrevcad> <mcharge /> <mprecimmo>2300</mprecimmo> <cstyle>CAR</cstyle> <dcre>12/12/2004</dcre> <dmod>18/12/2004</dmod> <qbureau>1</qbureau> <qsurfterrasse>32</qsurfterrasse> <qmurmitoy /> <ctypmeta>mai</ctypmeta> <sfilenamephoto1>1895fr1p129.jpg</sfilenamephoto1> - <photo> <nphoto>129</nphoto> - <lshortdescfr> - <![CDATA[ Façade ]]> </lshortdescfr> <sfilename>1895fr1p129.jpg</sfilename> <url>http://www.monagence.net/photo/1895fr1p129.jpg</url> <nangle /> <nordre>1</nordre> </photo> - <photo> <nphoto>2</nphoto> - <lshortdescfr> - <![CDATA[ cuisine ]]> </lshortdescfr> <sfilename>1895fr1p2.jpg</sfilename> <url>http://www.monagence.net/photo/1895fr1p2.jpg</url> <nangle /> <nordre>2</nordre> </photo> - <photo> <nphoto>7</nphoto> - <lshortdescfr> - <![CDATA[ Séjour ]]> </lshortdescfr> <sfilename>1895fr1p7.jpg</sfilename> <url>http://www.monagence.net/photo/1895fr1p7.jpg</url> <nangle /> <nordre>3</nordre> </photo> - <photo> <nphoto>11</nphoto> - <lshortdescfr> - <![CDATA[ Chambre ]]> </lshortdescfr> <sfilename>1895fr1p11.jpg</sfilename> <url>http://www.monagence.net/photo/1895fr1p11.jpg</url> <nangle /> <nordre>4</nordre> </photo> - <biendesc> <clangue>fr</clangue> - <ltypmeta> - <![CDATA[ Maison ]]> </ltypmeta> - <ltypmetafr> - <![CDATA[ Maison ]]> </ltypmetafr> - <lregion> - <![CDATA[ Aquitaine ]]> </lregion> - <lnaturebien> - <![CDATA[ Résidentiel ]]> </lnaturebien> - <lenvironnement> - <![CDATA[ Campagne non-isolée ]]> </lenvironnement> - <ldisponibilite> - <![CDATA[ A l'acte ]]> </ldisponibilite> - <lstyle> - <![CDATA[ Caractère ]]> </lstyle> - <ltypmandat> - <![CDATA[ Biens AV ]]> </ltypmandat> - <letat> - <![CDATA[ Bon ]]> </letat> - <lchauf> - <![CDATA[ Bois et Fuel ]]> </lchauf> - <ltypcuisine> - <![CDATA[ Aménagée ]]> </ltypcuisine> - <ltyp> - <![CDATA[ Maison ]]> </ltyp> + <ltitre> - <![CDATA[ Magnifique maison en pierres apparentes avec parc arboré ]]> </ltitre> - <lannonce> - <![CDATA[ Magnifique maison en pierres apparentes avec parc arboréSéjour de 30 m² avec cheminée en pierre, cuisine aménagée de 22 m², un wc, à l'étage: 3 chbs de 20 m², une mezz , SdB lumineuse, wc, cave, garage, grand parc arboré et cloturé autour la maison de 2 500m², située à proximité d'un charmant petit village ]]> </lannonce> + <lannonceweb> - <![CDATA[ Un séjour de 30 m² avec cheminée en pierre, une cuisine aménagée de 22 m² avec cheminée (insert), une chaufferie servant de lingerie, un wc, à l'étage: 3 chambres de 20 m², une mezzanine avec poutres apparentes, une salle de bains lumineuse, un wc, une cave, un grand garage, un grand parc arboré et cloturé autour la maison de 2 500m², le tout situé à proximité d'un charmant petit village ]]> </lannonceweb> - <lhtml> - <![CDATA[ <P>Un séjour de 30 m² avec cheminée en pierre, une cuisine aménagée de 22 m² avec cheminée (insert), une chaufferie servant de lingerie, un wc, à l'étage: 3 chambres de 20 m², une mezzanine avec poutres apparentes, une salle de bains lumineuse, un wc, une cave, un grand garage, un grand parc arboré et cloturé autour la maison de 2 500m², le tout situé à proximité d'un charmant petit village</P> ]]> </lhtml> - <lascii> - <![CDATA[ Un séjour de 30 m² avec cheminée en pierre, une cuisine aménagée de 22 m² avec cheminée (insert), une chaufferie servant de lingerie, un wc, à l'étage: 3 chambres de 20 m², une mezzanine avec poutres apparentes, une salle de bains lumineuse, un wc, une cave, un grand garage, un grand parc arboré et cloturé autour la maison de 2 500m², le tout situé à proximité d'un charmant petit village ]]> </lascii> </biendesc> </bien>


Le script php utilisé :

Code : Tout sélectionner

function contenu_textuel($noeud_parent) { $noeuds = $noeud_parent->child_nodes(); while($noeud = array_shift($noeuds)) { if ($noeud->node_type() == XML_TEXT_NODE) { $resultat = $noeud->node_value(); return $resultat; } } } function traitement_element($noeud_parent, $nom) { $noeuds = $noeud_parent->child_nodes(); while($noeud = array_shift($noeuds)) { if ($noeud->node_name() == $nom) { $resultat = contenu_textuel($noeud); return $resultat; } } } function traitement_attribut($noeud_parent, $nom, $attribut) { $noeuds = $noeud_parent->child_nodes(); while($noeud = array_shift($noeuds)) { if ($noeud->node_name() == $nom) { $resultat = $noeud->get_attribute($attribut); return $resultat; } } } $tab_elements = array("bien","cbien","mprix","ctyp","qpieces","qsurfhab","llocalite","sfilenamephoto1","photo","lcp","cregion","qsurfterrain","ndisponibilite","lannonceweb","ltitre","sfilename","photo"); $xml_doc = domxml_open_file("export.xml") or die("Impossible d'ouvrir le fichier XML !"); $element_racine = $xml_doc->document_element(); $noeuds_enfants = $element_racine->child_nodes(); foreach($noeuds_enfants as $noeud) { if($noeud->node_type() == XML_TEXT_NODE) continue; for($i = 0; $i < sizeof($tab_elements); $i++) { ${$tab_elements[$i]} = traitement_element($noeud, $tab_elements[$i]); } foreach($tab_attributs as $cle=>$valeur) { $$cle = traitement_attribut($noeud, $tab_elements[$valeur], $cle); } if($cbien != "") { // on récupère les infos principales echo "Référence du bien : $cbien<br> Type de bien : $ctyp<br> Prix : $mprix<br><br>"; } }
Si quelqu'un pouvait m'apporter son savoir sur le sujet ce serait vraiment sympa.

Erwann

Petit nouveau ! | 5 Messages

03 déc. 2006, 13:03

Si cela peut aider voici un exemple du fichier xml complet :

-http://www.ai2f-immo.com/xml/export.xml

Merci

Mammouth du PHP | 19672 Messages

03 déc. 2006, 13:13

Salut,
est-ce que tu as un message d'erreur ? Si oui, lequel ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 5 Messages

03 déc. 2006, 13:52

Non aucun message d'erreur, en fait je n'arrive pas à récupérer les élements qui ne sont pas de premier niveau.

Je pense qu'il faudrait tout bêtement faire une boucle sur les blocs qui comporte des sous élements de chaque bien pour récupérer chaque sous-élements.

Peut etre que je me trompe sur les termes à employer, je sais pas si vous comprenez ce que je veux faire.

Merci de ton aide en tout cas ;) j'en ai vraiement besoin,.

Erwann

Mammouth du PHP | 19672 Messages

03 déc. 2006, 14:02

Je n'ai pas testé, mais tu devrais explorer la fonction domxml_xmltree() : tu récupères le contenu de ton fichier XML dans un tableau PHP :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 5 Messages

03 déc. 2006, 15:02

Merci pour ton aide ! J'etais justement en train de m'interesser à cette fonction ... impossible d'en faire quelque chose. j'ai du boulot encore à faire :oops:

J'ai trouvé un autre bout de code tout à fait sympa, j'ai enfin réussi à récupérer les élements d'un bloc photo, je suis aux anges la. Enfin ce n'est pas gagné encore car je n'arrive pas à les regrouper sous un bien.

Donc je ressors tous les élements du fichier xml.

Voici le code :
<?php
 
// FONCTION qui va lire le fichier XML et le placer dans un tableau 
// Cette fonction sert de parseur 

function lit_xml($fichier,$item,$champs) { 
   // on lit le fichier 
   if($chaine = @implode("",@file($fichier))) { 
      // on explode sur <item> 
      // Dans l'exemple il s'agit de 'profil' 
      $tmp = preg_split("/<\/?".$item.">/",$chaine); 
      // pour chaque <item> donc tous les profils 
      for($i=1;$i<sizeof($tmp)-1;$i+=2) 
         // on lit les champs demandés <champ> donc il s'agit de 'id' et 'prenom' 
         foreach($champs as $champ) { 
            $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]); 
            // on ajoute l'élément au tableau 
            $tmp3[$i-1][] = @$tmp2[1]; 
         } 
      // et on retourne le tableau dans la fonction 
      return $tmp3; 
   } 
} 

$xml = lit_xml("../xml/export.xml","bien",array("nbien","cagence","cbien","mprix","ctyp","nannee")); 

// Une petite boucle suffit pour retrouver les élément du tableau 
// retourné dans la fonction lit_xml() 
foreach($xml as $element) 
{ 
echo "".$element[0]." - ".$element[1]." - ".$element[2]." - ".$element[3]." - ".$element[4]."<br>"; 
} 


$xml = lit_xml("../xml/export.xml","photo",array("sfilename")); 

// Une petite boucle suffit pour retrouver les élément du tableau 
// retourné dans la fonction lit_xml() 
foreach($xml as $element_photo) 
{ 
echo "".$element_photo[0]."<br>"; 
} 
?>
Ce qui me done :
1 - demo - 005 - 225000 - ma
2 - demo - 002 - 185000 - pav
3 - demo - 003 - 280000 - prob
4 - demo - 004 - 210000 - apt
5 - demo - 001 - 730000 - chat
1895fr1p129.jpg
1895fr1p2.jpg
1895fr1p7.jpg
1895fr1p11.jpg
1895fr2p14.jpg
1895fr2p17.jpg
1895fr2p18.jpg
1895fr3p120.jpg
1895fr3p122.jpg
1895fr3p119.jpg
1895fr3p121.jpg
1895fr4p72.jpg
1895fr4p65.jpg
1895fr4p126.jpg
1895fr5p33.jpg
1895fr5p34.jpg
1895fr5p39.jpg
si quelqu'un avait la méthode pour afficher les élements photo d'un seul bien je suis preneur, ou bien un élement de réponse ...

Merci

Erwann

Petit nouveau ! | 5 Messages

04 déc. 2006, 09:46

Bonjour,

Peronnes n'a d'idées sur le problème ? Je n'arrive pas à spécifier dans la boucle de chaque bien une autre boucle sur les élements photo ... cela me parait si simple mais pourtant....

Merci de votre aide ;)

Mammouth du PHP | 19672 Messages

04 déc. 2006, 10:44

Tiens, essaye avec ça :
<?php
$fichier = "./export.xml";

$f = fopen($fichier, "r");
if(false != ($ligne = fread($f, filesize($fichier))))
{
    $tableau = domxml_xmltree($ligne);

    echo("<pre>\n");
    print_r($tableau);
    echo("</pre>\n");
}
fclose($f);
?>
Sur la base de ton propre fichier XML, j'obtiens un tableau d'un taille assez respectable, mais c'est utilisable avec les fonctions de tris de tableaux
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 5 Messages

04 déc. 2006, 10:58

Bonjour,

Merci pour ton aide vraiment ;) wawoo les tableaux !! je ne sais pas si je serais capable de trier de tels tableaux :shock:

Je vais me pencher sur les fonctions de tries des tableaux.

Aspirine svp ..

Merci