8768 sujets

Développement web côté serveur, CMS

Bonjour!

je récupère des données d'un fichier xml sur un serveur distant grace à simpleXML, je les affiche tout va bien. MAIS quand je veux filtrer suivant le contenu d'une balise (un peu comme avec WHERE en sql) avec xpath , j'affiche ce que j'ai filtré mais je ne peux plus accéder aux informations des noeuds du même niveau que celui atteint avec xpath.

Je m'explique, je récupère les données d'une agence immobilière et le fichier xml se présente comme ceci :

<LISTEPA>
<BIEN>
<INFO_GENERALES>...</INFO_GENERALES>
<AGENCE>...</AGENCE>
<VENTE>...</VENTE>
<MAISON>...</MAISON>
<LOCALISATION>...</LOCALISATION>
<DEFISCALISATION>...</DEFISCALISATION>
<INTITULE>...</INTITULE>
<COMMENTAIRES>...</COMMENTAIRES>
<ALUR>...</ALUR>
<VIAGER>...</VIAGER>
<IMAGES>...</IMAGES>
<IMAGES_HD></IMAGES_HD>
<PIECES>...</PIECES>
</BIEN>
</LISTEPA>

Je souhaiterai par exemple afficher les biens qui sont proposés par l'agence de strasbourg en allant dans le noeud <AGENCE> puis <AGENCE_VILLE>. Je fais donc une requete xpath du style:

$elements = $xml->xpath('//BIEN/AGENCE[AGENCE_VILLE=strasbourg]');


Sauf qu'après, avec ma boucle foreach dans mon fichier html, je ne peux plus afficher les infos des noeuds <INFOS_GENERALES> ou <MAISON> ...

<section class="wrapper flex3">
    <?php foreach ($elements as $bien): ?>
    <article class="bien">
      <div class="photo_bien"><img src="<?= $bien->IMAGES->IMG[0] ?>"/></div>
      <h4><?= $bien->LOCALISATION->VILLE ?></h4>
      <p><?= $bien->INTITULE->FR ?></p>
      <p><strong>Nbre de chambres :</strong> <?= $bien->NOMBRE_CHAMBRES ?></p>
      <p><strong>Prix :</strong> <?= $bien->VENTE->PRIX_NET ?> euros</p>
      <p><strong>Agence :</strong> <?= $bien->AGENCE->AGENCE_VILLE ?></p>
      <a href="#">VOIR PLUS</a>
    </article>
  <?php endforeach ?>
</section>


Je sais bien que je pointe pas là où il faut pour les premiers (h4 et p) mais c'est ceux que j'utilisais au début avec simplexml_load_file, et làs je ne voie pas comment relire les infos des noeuds précédent ou du même niveau Smiley ohwell ...
Ca parle à qqun? Peut-être avec une autre méthode? Je suis paumé...
Merci d'avance,

Julien
Vu mes piètres compétences, je vote pour la soluce n°2 qui me parle un peu plus! Je teste ça asap en espérant ne pas trop galérer :O...
En tout cas merci, je te tiens au courant!
Yihaa merci Bazooka07!
Après une demie-heure de testing, j'ai réussi!
Ça donne donc en PHP :

class noeud_parent extends SimpleXMLElement
{
    public function get_parent_node()
    {
        return current($this->xpath('parent::*'));
    }
}

$url = 'http://clients.ac3-distribution.com/office5/ageprim/cache/export.xml';
$xml = simplexml_load_file($url, 'noeud_parent');

$elements = $xml->xpath('//BIEN/MAISON[NBRE_CHAMBRES=5]');


et sur le HTML on rappelle la fonction :

<?php foreach ($elements as $bien): ?>
    <article class="bien">
      <div class="photo_bien"><img src="<?= $bien->get_parent_node()->IMAGES->IMG[0] ?>"/></div>
      <h4><?= $bien->get_parent_node()->LOCALISATION->VILLE ?></h4>
      <p><?= $bien->get_parent_node()->INTITULE->FR ?></p>
      <p><strong>Nbre de chambres :</strong> <?= $bien->get_parent_node()->NOMBRE_CHAMBRES ?></p>
      <p><strong>Prix :</strong> <?= $bien->get_parent_node()->VENTE->PRIX_NET ?> euros</p>
      <p><strong>Agence :</strong> <?= $bien->get_parent_node()->AGENCE->AGENCE_VILLE ?></p>
      <a href="#">VOIR PLUS</a>
    </article>
  <?php endforeach ?>


J'aurais pas trouvé seul, mes compétences en PHP sont limitées pour l'instant, mais au moins j'aurais appris un truc ^^...

Merci encore!

Julien
Hello,
en fait je dois filtrer l'affichage de mes informations un peu plus que prévu ; c'est donc un site pour une agence immobilière, et j'aimerais filtrer les annonces selon si c'est pour une maison ou un appartement (ça j'arrive à faire), mais aussi selon l'identifiant de l'agent, et c'est là que ça coince...

<?php

include 'utilities.php';

class noeud_parent extends SimpleXMLElement
{
    public function get_parent_node()
    {
        return current($this->xpath('parent::*'));
        return current($this->xpath('//BIEN/NEGOCIATEUR[NEGOCIATEUR_ID=436344]'));
    }
}

$url = 'http://clients.ac3-distribution.com/office5/ageprim/cache/export.xml';
$xml = simplexml_load_file($url, 'noeud_parent');

$maisons = $xml->xpath('//BIEN/MAISON[SS_TYPE=2]');
$appartements = $xml->xpath('//BIEN/APPARTEMENT[SS_TYPE=1]');

$template = 'vente_alsace';

include 'layout.phtml';

?>


Mon arbre XML se décompose ainsi :

<BIEN>
<INFO_GENERALES>...</INFO_GENERALES>
<AGENCE>...</AGENCE>
<NEGOCIATEUR>
<NEGOCIATEUR_ID>452329</NEGOCIATEUR_ID>
<NEGOCIATEUR_NOM>...</NEGOCIATEUR_NOM>
<NEGOCIATEUR_NOM_FAMILLE>...</NEGOCIATEUR_NOM_FAMILLE>
<NEGOCIATEUR_PRENOM>...</NEGOCIATEUR_PRENOM>
<NEGOCIATEUR_TEL_FIXE>...</NEGOCIATEUR_TEL_FIXE>
</NEGOCIATEUR>
<VENTE>...</VENTE>
<MAISON>...</MAISON>
<LOCALISATION>...</LOCALISATION>
<DEFISCALISATION>...</DEFISCALISATION>
<INTITULE>...</INTITULE>
<COMMENTAIRES>...</COMMENTAIRES>
<ALUR>...</ALUR>
<VIAGER>...</VIAGER>
<IMAGES>...</IMAGES>
<PIECES> </PIECES>
</BIEN>

Il me faudrait une instruction xpath qui me permette de filtrer selon l'ID du négociateur et qui récupèrerait aussi toutes les infos du noeud parents (BIENS->)...

Merci d'avance...