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

Langage PHP Discussion :

XLM parser : comment accèder à certains éléments d'un XML


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 898
    Par défaut XLM parser : comment accèder à certains éléments d'un XML
    Bonjour
    Je n'arrive pas à accéder à certains éléments (en gras dans l'extrait ci-dessous) d'un XML que j'ai à exploiter.
    Voici un extrait du 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
    <?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 requestID="abc" version="1.2">
        <ReverseGeocodeResponse>
          <ReverseGeocodedLocation>
            <gml:Point>
              <gml:pos>45.950091 1.134881</gml:pos>
            </gml:Point>
            <Address countryCode="PositionOfInterest">
              <StreetAddress/>
              <Place type="Municipality">peyrilhac</Place>
              <Place type="Departement">87</Place>
              <Place type="Bbox">1.057805;45.932981;1.177533;45.995295</Place>
              <Place type="Importance">4</Place>
              <Place type="Commune">Peyrilhac</Place>
              <Place type="INSEE">87118</Place>
              <Place type="Nature">Commune</Place>
              <Place type="Territoire">FXX</Place>
              <PostalCode>87510</PostalCode>
            </Address>
            <xlsext:ExtendedGeocodeMatchCode>City</xlsext:ExtendedGeocodeMatchCode>
            <SearchCentreDistance value="0.00"/>
          </ReverseGeocodedLocation>
    Voici un extrait du code PHP utilisé
    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
      $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;
    	$Point = $ReverseGeocodeLocation->{'gml:Point'};
    	   print_r($Point)."<hr>"; 
     
        $aPlace[] = array();
        $aPlace['LAT_LON'] = (string)$Point->{'gml:pos'};
     
        $aPlace['Distance'] = (string)$ReverseGeocodeLocation->SearchCentreDistance["value"];
     
     
        $Address = $ReverseGeocodeLocation->Address;
     
    	foreach ($Address->Place as $Place) {
              $type = (string)$Place['type'];
             $aPlace[$type] = (string)$Place;
          }
    Je crois avoir essayé toutes les combinaisons pour gml, gmloint ...

    Une idée ?

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    En xml, on ne contourne pas la construction générique de namespace - on le fait face.
    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
      $Lieudit=$Commune='';
     
      $nsxls="http://www.opengis.net/xls";
      $nsgml="http://www.opengis.net/gml";
      $nsxlsext="http://www.opengis.net/xlsext";
     
      foreach($xml->children($nsxls)->Response
        ->children($nsxls)->ReverseGeocodeResponse
        ->children($nsxls)->ReverseGeocodedLocation as $ReverseGeocodeLocation) {
     
        $Point = $ReverseGeocodeLocation->children($nsgml)->Point;
     
        $aPlace[] = array();
        $aPlace['LAT_LON'] = (string)$Point->children($nsgml)->pos;
     
        $aPlace['Distance'] = (string)$ReverseGeocodeLocation->children($nsxls)->SearchCentreDistance->attributes()->value;
     
        $Address = $ReverseGeocodeLocation->children($nsxls)->Address;
     
        foreach ($Address->children($nsxls)->Place as $Place) {
          $type = (string)$Place->attributes()->type;
          $aPlace[$type] = (string)$Place;
        }
      }

  3. #3
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Je peux ajouter aussi, même ce n'est pas la question posée, que l'écriture de xsi:schemaLocation
    xsi:schemaLocation="http://wxs.ign.fr/schemas/olsAll.xsd"
    est fausse. Il vous faut absolument la corriger.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 898
    Par défaut
    Bonjour tsuji
    Merci pour ta réponse rapide ; ceci dit, après quelques modifications dans le code que tu as proposé ( $aPlace['LAT_LON'] = (string)$Point->pos, je n'arrive pas à récupérer la valeur de <SearchCentreDistance value="830.42"/>.
    Pourrais-tu jeter un oeil ?
    D'autre part, à propos de ta remarque sur xsi:schemaLocation, en quoi la syntaxe est-elle fausse ? Le XML utilisé est issu d'un web service de l'IGN auquel je ferai remonter ta remarque mais je doute que l'IGN modifie quoi que se soit !!!

    Ci-dessous l'extrait du dernier code PHP

    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
    $xml = simplexml_load_string($texte);
    echo $texte;
    //    print_r($xml->Response); exit;
      // $reponse .= $xml->Response['requestID'] . "\n";
    	$Lieudit=$Commune='';
     
      $nsxls="http://www.opengis.net/xls";
      $nsgml="http://www.opengis.net/gml";
      $nsxlsext="http://www.opengis.net/xlsext";
     
      foreach($xml->children($nsxls)->Response
        ->children($nsxls)->ReverseGeocodeResponse
        ->children($nsxls)->ReverseGeocodedLocation as $ReverseGeocodeLocation) {
     
        $Point = $ReverseGeocodeLocation->children($nsgml)->Point;
     
        $aPlace[] = array();
        $aPlace['LAT_LON'] = (string)$Point->pos;
    	$List_Coord=explode(" ",(string)$Point->pos);
    	$aPlace['LAT'] = $List_Coord[0];
    	$aPlace['LONG'] = $List_Coord[1];
     
        $aPlace['Distance'] = (string)$ReverseGeocodeLocation->children($nsxls)->SearchCentreDistance->attributes()->value;

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 898
    Par défaut
    L'erreur est trouvée : $aPlace['distance']et non $aPlace['Distance'] lors de l'utilisation.
    Merci pour ton aide éclairée !
    PS : la remarque sur xsi:schemaLocation appelle une réponse si tu as le temps/

  6. #6
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    PS : la remarque sur xsi:schemaLocation appelle une réponse
    Oui, volontiers.

    La valeur de l'élément est du genre liste de type anyURI. Le détail dépend des cas concrets. La liste serait composée de nombres pair de certaines uri avec espace blanc comme séparateur. Il apparaît toujours en pair. Si ...olsAll.xsd est pour un targetNamespace de namespace http://www.opengis.net/xls duquel tous les autres schémas seraient importés, il pourrait s'écrire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsi:schemaLocation="http://www.opengis.net/xls http://wxs.ign.fr/schemas/olsAll.xsd"
    C'est la forme minimale qui est valable dans le réel si l'assomption dessus correspond à leur conception schématique.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 898
    Par défaut
    Merci pour ton aide !

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

Discussions similaires

  1. [Xaml/C#:CustomControl] Comment accéder à des éléments du Template?
    Par SuprazZz dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 26/11/2008, 20h40
  2. comment accéder aux éléments d'une liste
    Par RouRa22 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 07/05/2008, 13h53
  3. Comment accéder un élément dans un texte inclus
    Par lvr dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/11/2007, 22h43
  4. Réponses: 11
    Dernier message: 15/06/2007, 17h43
  5. Réponses: 4
    Dernier message: 16/03/2007, 18h25

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