IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IGN API Géoportail Discussion :

Parser le XML en retour du service OLS en PHP avec SimpleXml


Sujet :

IGN API Géoportail

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 73
    Par défaut Parser le XML en retour du service OLS en PHP avec SimpleXml
    Bonjour,

    J'essaye de décoder un retour du service OLS que je récupère avec curl
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
     
    <?xml version="1.0" encoding="UTF-8"?>
    <XLS version="1.2" xmlns="http://www.opengis.net/xls"
      xmlns:gml="http://www.opengis.net/gml"
      xmlns:xls="http://www.opengis.net/xls"
      xmlns:xlsext="http://www.opengis.net/xlsext"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://wxs.ign.fr/schemas
    /olsAll.xsd">
      <ResponseHeader/>
      <Response version="1.2">
        <GeocodeResponse>
          <GeocodeResponseList numberOfGeocodedAddresses="1">
            <GeocodedAddress>
              <gml:Point>
                <gml:pos>44.837778 -0.579197</gml:pos>
              </gml:Point>
              <Address countryCode="StreetAddress">
                <StreetAddress>
                  <Street/>
                </StreetAddress>
                <Place type="Municipality">Bordeaux</Place>
                <Place type="Qualite">30.0</Place>
                <Place type="Departement">33</Place>
                <Place type="Bbox">-0.638699;44.810742;-0.533325;44.916694</Place>
                <Place type="Commune">Bordeaux</Place>
                <Place type="INSEE">33063</Place>
                <Place type="Territoire">FXX</Place>
                <PostalCode>33000</PostalCode>
              </Address>
              <GeocodeMatchCode accuracy="1.0" matchType="City"/>
            </GeocodedAddress>
          </GeocodeResponseList>
        </GeocodeResponse>
      </Response>
    </XLS>

    Quand je le décode, je n'arrive pas à récupérer la position :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $xml = new \SimpleXMLElement($xmlresult); print_r($xml);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [version] => 1.2
            )
    
        [ResponseHeader] => SimpleXMLElement Object
            (
            )
    
        [Response] => SimpleXMLElement Object
            (
                [@attributes] => Array
                    (
                        [version] => 1.2
                    )
    
                [GeocodeResponse] => SimpleXMLElement Object
                    (
                        [GeocodeResponseList] => SimpleXMLElement Object
                            (
                                [@attributes] => Array
                                    (
                                        [numberOfGeocodedAddresses] => 1
                                    )
    
                                [GeocodedAddress] => SimpleXMLElement Object
                                    (
                                        [Address] => SimpleXMLElement Object
                                            (
                                                [@attributes] => Array
                                                    (
                                                        [countryCode] => StreetAddress
                                                    )
    
                                                [StreetAddress] => SimpleXMLElement Object
                                                    (
                                                        [Street] => SimpleXMLElement Object
                                                            (
                                                            )
    
                                                    )
    
                                                [Place] => Array
                                                    (
                                                        [0] => Bordeaux
                                                        [1] => 30.0
                                                        [2] => 33
                                                        [3] => -0.638699;44.810742;-0.533325;44.916694
                                                        [4] => Bordeaux
                                                        [5] => 33063
                                                        [6] => FXX
                                                    )
    
                                                [PostalCode] => 33000
                                            )
    
                                        [GeocodeMatchCode] => SimpleXMLElement Object
                                            (
                                                [@attributes] => Array
                                                    (
                                                        [accuracy] => 1.0
                                                        [matchType] => City
                                                    )
    
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
    )
    Les balises gml ne sont pas converties.

    Pourtant les namespaces du xml ont bien l'air connus, y compris le gml :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $namespaces = $xml->getNamespaces(true); print_r($namespaces);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Array
    (
        [] => http://www.opengis.net/xls
        [xsi] => http://www.w3.org/2001/XMLSchema-instance
        [gml] => http://www.opengis.net/gml
    )
    Mais voila, impossible de récupérer ces <gml: Point> et <gml:pos>.

    Quelqu'un a déjà décodé ce XML en PHP ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 133
    Par défaut Sur du reverse pour trouver les lieudits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    function parse_ReverseGeocodeResponse($texte) {
      $reponse = '';
      $xml = simplexml_load_string($texte);
    //    print_r($xml->Response); exit;
      $reponse .= $xml->Response['requestID'] . "\n";
      $Lieudit=$Commune='';
      foreach($xml->Response->ReverseGeocodeResponse->ReverseGeocodedLocation as $ReverseGeocodeLocation) {
    //      print_r($ReverseGeocodeResponse); exit;
        $Address = $ReverseGeocodeLocation->Address;
    //      print_r($Address->PostalCode); exit;
        $aPlace[] = array();
        foreach ($Address->Place as $Place) {
    //        print_r($Place); exit;
    //      echo $Place['type'] . "=>" . $Place . "\n";
          $type = (string)$Place['type'];
          $aPlace[$type] = (string)$Place;
        }
    //      print_r($aPlace); exit;
    //      print_r($aPlace['Nature']);exit;
        $Nature = (string) $aPlace['Nature'];
        if ( $Commune == '' && $Nature == 'Commune' ) {
          $Commune = $aPlace['Commune'];
        }
        $Importance = (string) $aPlace['Importance'];
        if ( $Lieudit == '' && (preg_match('/^Lieu/', $Nature) or $Importance > 6) && $Commune == $aPlace['Commune']) {
          $Lieudit = $aPlace['Municipality'];
        }
    //    echo "=\n";
      }
      $reponse .= "Commune:$Commune Lieudit:$Lieudit\n====\n";
      if ( $Lieudit == '') {
        echo $texte; exit;
      }
      return $reponse;
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 73
    Par défaut
    ça ne répond pas à ma question.
    Je fais du géocodage, pas du géocodage inverse, donc le XML a une forme légèrement différente.
    Et tu ne lis jamais des balises gml. Or ce sont les coordonnées du point qui sont dans les balises gml que je veux extraire.
    Avoir les coordonnées BBox des balises <Place> ne m'intéresse pas et je n'ai aucun problème pour lire ces balises.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Par défaut
    on peu faire une "bidouille" comme ça pour éviter le soucis des gml:, ms:,wfs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $xml = "http://URL/VERS/LE/XML";
    $file = str_replace(array('gml:','ms:','wfs:'),'',file_get_contents($xml));
    //A ce niveau, le xml est débarrassé de ces balises
    $xml = simplexml_load_string($file);

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 73
    Par défaut
    Merci adrien91. J'aurais fait comme ça en dernière extrémité. Parce qu'intellectuellement...

    Finalement j'ai réussi en utilisant DOMDocument et DOMXPath plutôt que SimpleXMLElement.

    En fait ce sont plutôt les balises du namespace par défaut qui ont été les plus "tricky" à récupérer. Avec XPath j'ai du utiliser local-name().

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
      $xml = new \DOMDocument();
      $xml->loadXML($xmlresult);
      $xpath = new \DOMXPath($xml);
     
      $arrayResponse = array();
     
      //  Balises <GeocodedAddress> // DOMNodeList dont chaque item est un DOMElement
      $GeocodedAddresses = $xpath->query("//*[local-name() = 'GeocodedAddress']");
     
      foreach($GeocodedAddresses as $GeocodedAddress) {
        $arrayProp = [];
     
        // Propriétés de l'addresse (balise <Address>)
        $address = $xpath->query("child::*[local-name() = 'Address']", $GeocodedAddress)->item(0);
        // Contenu de la balise <Place type="Commune"> enfant de <Address>
        $arrayProp["name"] = $xpath->query("child::*[local-name() = 'Place'][@type = 'Commune']", $address)->item(0)->textContent;
        // et ainsi de suite pour les autres balises <Place type="foo"> qui me sont utiles.
        $arrayProp["insee"] = $xpath->query("child::*[local-name() = 'Place'][@type = 'INSEE']", $address)->item(0)->textContent;
        // ...
     
        // Position
        $pos = $xpath->query('child::gml:Point/gml:pos', $GeocodedAddress);
        $latlon = explode(" ", $pos->item(0)->textContent);
        $arrayProp["lat"] = $latlon[0];
        $arrayProp["lon"] = $latlon[1];
     
        $arrayResponse[] = $arrayProp;
      }

    Ainsi j'arrive à parser les réponses du géocodage et géocodage inverse pour en faire un tableau à ma sauce.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parser requete XML Web Service WCF
    Par abmptit dans le forum Services Web
    Réponses: 0
    Dernier message: 29/06/2012, 12h10
  2. parser un xml en retour d'ajax JQuery
    Par Tux1 dans le forum jQuery
    Réponses: 6
    Dernier message: 27/12/2011, 14h58
  3. Appeler un web service SOAP en php avec un client JavaScript
    Par lord.66 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/06/2009, 14h04
  4. Appeler un web service SOAP en php avec un client JavaScript
    Par lord.66 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 31/05/2009, 12h42
  5. xml->html : retour chariot, espaces dans un div
    Par d'Oursse dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 27/04/2004, 19h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo