使用命名空间从 XML 响应中获取 PHP 数组

Posted

技术标签:

【中文标题】使用命名空间从 XML 响应中获取 PHP 数组【英文标题】:Get PHP array from XML responce with namespaces 【发布时间】:2017-12-18 18:32:14 【问题描述】:

我收到来自 GEO 服务 (PDOK) 的 XML 响应。 $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 对象 ( )

如有任何帮助,我们将不胜感激!

【问题讨论】:

向我们展示你是如何使用 SimpleXML 的 $xml = new \SimpleXMLElement($response->raw_body); print_r($xml); 你怎么得到$response-&gt;raw_body 我不是牙医,请不要逼我在这里拔牙 开启你的 PHP 错误报告。 【参考方案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;

【讨论】:

$xml = simplexml_load_file($file); foreach($xml-&gt;xpath('//xls:GeocodeResponseList') as $header) 也可以,不需要注册命名空间...【参考方案2】:

使用“->expectsJson()”代替“->expectsXml()”。然后这样做:

$array = json_decode($response-&gt;raw_body);

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

【讨论】:

无法强制输出到 Json Message: 'Unable to parse response as JSON'

以上是关于使用命名空间从 XML 响应中获取 PHP 数组的主要内容,如果未能解决你的问题,请参考以下文章

从 WCF RESTful 响应中删除 xml 命名空间

如何从 WEB API 请求和响应 XML 中删除命名空间?

使用 PHP 从 XML 中删除命名空间

Atitit xml命名空间机制

从 PHP 中的超类获取子类命名空间

使用命名空间和前缀的 JAXB 解组