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:
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:
$xml = new \SimpleXMLElement($xmlresult); print_r($xml);
Code:
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:
$namespaces = $xml->getNamespaces(true); print_r($namespaces);
Code:
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 ?
Sur du reverse pour trouver les lieudits
Code:
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;
} |