使用名称空间从 XML 响应中获取 PHP 数组
Get PHP array from XML responce with namespaces
我收到来自 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 解析器,但我收到的总是空值。
我认为这与名称空间有关。但是我不知道如何解决这个问题。
回复来自:
$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);
输出:
简单XML元素对象 ( )
欢迎任何帮助!
使用“->expectsJson()”代替“->expectsXml()”。然后这样做:
$array = json_decode($response->raw_body);
或者如果您使用 PHP 7.x:https://github.com/eddypouw/geodata-postal-api
经过一番挖掘,我找到了解决问题的办法。它确实是由名称空间决定的,在名称空间注册后使用 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;
我收到来自 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 解析器,但我收到的总是空值。 我认为这与名称空间有关。但是我不知道如何解决这个问题。
回复来自:
$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);
输出:
简单XML元素对象 ( )
欢迎任何帮助!
使用“->expectsJson()”代替“->expectsXml()”。然后这样做:
$array = json_decode($response->raw_body);
或者如果您使用 PHP 7.x:https://github.com/eddypouw/geodata-postal-api
经过一番挖掘,我找到了解决问题的办法。它确实是由名称空间决定的,在名称空间注册后使用 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;