从名称空间

时间:2017-07-13 19:44:43

标签: php arrays xml decode geo

我从GEO服务(PDOK)收到XML repsonce。 $ responce-> raw_body包含此XML结构:

<xls:GeocodeResponse xmlns:xls="http://www.opengis.net/xls" xmlns:gml="http://www.opengis.net/gml">
   <xls:GeocodeResponseList numberOfGeocodedAddresses="1">
      <xls:GeocodedAddress>
         <gml:Point srsName="EPSG:28992">
            <gml:pos dimension="2">121299.73296672151 487003.8972524117</gml:pos>
         </gml:Point>
         <xls:Address countryCode="NL">
            <xls:StreetAddress>
               <xls:Street>Rokin</xls:Street>
            </xls:StreetAddress>
            <xls:Place type="MunicipalitySubdivision">Amsterdam</xls:Place>
            <xls:Place type="Municipality">Amsterdam</xls:Place>
            <xls:Place type="CountrySubdivision">Noord-Holland</xls:Place>
         </xls:Address>
      </xls:GeocodedAddress>
   </xls:GeocodeResponseList>
</xls:GeocodeResponse>

如何访问此处的元素。例如,我想要一个PHP数组来访问元素121299.73296672151 487003.8972524117 抓住坐标。

还有其他元素。我使用SimpleXML解析器,但我收到的总是null。 我认为它与名称空间有关。但我不知道如何解决这个问题。

答案来自:


        $url = "http://geodata.nationaalgeoregister.nl/geocoder/Geocoder?zoekterm=xxxxx%20xx";
        $response = \Httpful\Request::get($url)
        ->expectsXml()
            ->send();

        $xml = new \SimpleXMLElement($response->raw_body);

        print_r( $xml);

输出:

SimpleXMLElement Object()

任何帮助都是适当的!

2 个答案:

答案 0 :(得分:1)

经过一番挖掘后,我找到了解决问题的方法。确实是命名空间,在命名空间注册后使用xpath时,你可以找到你需要的元素。

    $xml = new \SimpleXMLElement($response);
    $xml->registerXPathNamespace('xls', 'http://www.opengis.net/xls');
    $xml->registerXPathNamespace('gml', 'http://www.opengis.net/gml');

    foreach($xml->xpath('//xls:GeocodeResponseList') as $header)
    {
        $geocoordinates =  $header->xpath('//gml:pos');
        $street =  (string) ($header->xpath('//xls:Street')[0]);
        $place =  (string) ($header->xpath('//xls:Place')[2]);

    }

    echo $geocoordinates[0];              // get the coordinates needs to split on space
    echo "<br />";
    echo $geocoordinates[0]['dimension']; // get the dimension attribute
    echo "<br />";
    echo $street;
    echo "<br />";
    echo $place;

答案 1 :(得分:-1)

使用&#34; - &gt; expectedJson()&#34;而不是&#34; - &gt; expectedXml()&#34;。然后这样做:

$array = json_decode($response->raw_body);

或者如果您使用PHP 7.x:https://github.com/eddypouw/geodata-postal-api