Simplexml pour construire une liste de villes en fonction d'une région/départeme

Résolu
karpediem Messages postés 49 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 22 septembre 2014 - 20 mars 2009 à 20:54
karpediem Messages postés 49 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 22 septembre 2014 - 23 mars 2009 à 23:05
Bonsoir @ touteszéatous,

Je suis en train de m'essayer à la lecture de fichier XML en PHP...

L'idée est de construire une liste d"roulante en fonction de la sélection utilisateur :
- soit il n'a rien choisi => $_POST['id_region'] est vide,
- soit il a choisi une région => $_POST['id_region'] contient la valeur de la région,

- soit il a choisi un département => $_POST['id_depart'] contient la valeur du département, $_POST['id_region'] est forcément renseigné.

Je me suis essayé à plusieurs syntaxes, mais la seule qui fonctionne est dans le cas où rien n'est sélectionné...

Voici à quoi peut ressembler mon fichier XML

<MAIN>
    <REGION id="22" nom="Provence Alpes Cte d'azur" nb_lots="2554">
        <DEPARTEMENT id="13" nom="Bouches du Rhne" nb_lots="1311">
            <VILLE cp="13100" nom="Aix en provence" nb_lots="200" />
            <VILLE cp="13210" nom="St remy de provence" nb_lots="72" />
            <VILLE cp="13015" nom="Marseille" nb_lots="623" />
        </DEPARTEMENT>
        <DEPARTEMENT id="84" nom="Vaucluse" nb_lots="72">
            <VILLE cp="84130" nom="Le pontet (avignon)" nb_lots="72" />
        </DEPARTEMENT>
    </REGION>
    <REGION id="21" nom="Poitou Charentes" nb_lots="252">
        <DEPARTEMENT id="17" nom="Charente Maritime" nb_lots="192">
            <VILLE cp="17220" nom="St rogatien (la rochelle)" nb_lots="29" />
            <VILLE cp="17000" nom="La rochelle" nb_lots="82" />
            <VILLE cp="17390" nom="La tremblade" nb_lots="2" />
            <VILLE cp="17300" nom="Rochefort" nb_lots="15" />
        </DEPARTEMENT>
        <DEPARTEMENT id="86" nom="Vienne" nb_lots="60">
            <VILLE cp="86000" nom="Poitiers" nb_lots="60" />
        </DEPARTEMENT>
    </REGION>
</MAIN>

Voici mon code :

<select name="cp" size="1" id="cp" >
       <option value="-1" selected="selected">&nbsp;</option>
       <?php
              $xml = simplexml_load_file('media/liste.xml');
              $recup = $xml->xpath('/MAIN/REGION/DEPARTEMENT/VILLE') ;
              if ( $_POST['id_region'] == "")  {
                                    $ville = array();
                                    foreach ($recup as $list_ville) {
                                        $cp = "'".$list_ville['cp']."'" ;
                                        $ville["'".$list_ville['cp']."'"] = $list_ville['nom'];
                                    }
                                   asort($ville);
                                   foreach ($ville as $cp => $nom) {
                                        echo '<option value='.$cp.'>'.$nom.'</option>';
                                    }
                                   
                } else {
                           if ($_POST['id_depart'] == "") {
                                        foreach ($xml->REGION as $region) {
                                            if ($region->id == $_POST['id_region']) {
                                                foreach ($recup as $list_ville) {
                                                    echo '<option value="'.$list_ville['cp'].'">'.$list_ville['nom'].'</option>';
                                                }
                                            }
                                        }
                           } else {
                                        $dep = $_POST['id_depart'];
                                        $recup = $xml->xpath('/MAIN/REGION/DEPARTEMENT[contains(id,$dep)]/VILLE') ;
                                        $ville = array();
                                        foreach ($recup as $list_ville) {
                                            $cp = "'".$list_ville['cp']."'" ;
                                            $ville["'".$list_ville['cp']."'"] = $list_ville['nom'];
                                        }
                                        asort($ville);
                                        foreach ($ville as $cp => $nom) {
                                            echo '<option value='.$cp.'>'.$nom.'</option>';
                                        }
                              }
                      }
                              
       ?>
</select>

Le pb c'est que seul la 1ere condition fonctionne... En fait dès que je veut faire la liste des villes à l'intérieur d'un noeud, ça ne fonctionne pas. Je crois que le problème vient du fait que je ne sait pas accéder directement à un noeud tel que la région ou le département en lui passant un paramètre...

J'ai aussi essayé des choses dans ce genre '/REGION/DEPARTEMENT/@id' pour pointer l'attribut 'id' de département...

J'ai cherché sur le web, mais la plupart des exemples concerne les flux rss donc des xml qui ont des balises ouvrantes et des balises fermantes et apparemment la syntaxe pour accéder aux info n'est pas la même...

Quelqu'un aurait-il svp une idée de comment je pourrais faire ?

Excellente soirée @ touteszéatous et à bientôt !
A voir également:

1 réponse

karpediem Messages postés 49 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 22 septembre 2014
23 mars 2009 à 23:05
ça y est, j'ai trouvé la bonne syntaxe :


$region= $_POST['id_region'];

$depart = $_POST['id_depart'];

$recup = $xml->xpath("/MAIN/REGION[@id='$region']/DEPARTEMENT[@id='$depart']/VILLE") ;


Voili voilu, j'espère que ça aidera quelqu'un !


Excellente soirée @ touteszéatous et à bientôt !
3
Rejoignez-nous