0

我创建了一个获取 gpslocation 并创建 url 的 android 应用程序: https ://maps.googleapis.com/maps/api/geocode/xml?latlng=00.00,00.00&sensor=true

示例: https ://maps.googleapis.com/maps/api/geocode/xml?latlng=42.120636,-72.568731&sensor=true

这将返回(仅一部分):

<GeocodeResponse>
    <status>OK</status>
    <result>
        <type>street_address</type>
        <formatted_address>
            17 Dorchester Street, Springfield, Massachusetts 01109, United States
        </formatted_address>
        <address_component>
            <long_name>17</long_name>
            <short_name>17</short_name>
            <type> ...

我对这部分感兴趣:17 Dorchester Street, Springfield, Massachusetts 01109, United States

我想创建一个包含邮政编码“01109”的新网址,例如 http://mysite.com?process=01109并打开此站点。

谁能帮我!

4

3 回答 3

0

您可以使用 simplexml 和 xpath 访问 postal_code short_name。这是一个工作示例:

$location = simplexml_load_file('https://maps.googleapis.com/maps/api/geocode/xml?latlng=42.120636,-72.568731&sensor=true');

$postal_code_search = 
$location->xpath('//result[type="street_address"]/address_component[type="postal_code"]/short_name');
$postal_code = (string) $postal_code_search[0];

请注意,您必须将值显式转换为字符串,因为 simplexml 将在打印时将数组或对象返回给变量而不是字符串(这在测试时可能会造成混淆)。

于 2013-03-16T13:46:01.593 回答
0

要从 googleapis 地理编码响应中获取特定数据,您不仅需要通过元素的名称来定位元素,还需要通过其内容来定位元素。

这可以通过 Xpath 轻松完成。幸运的是,PHP 中的 SimpleXML 扩展对读取这种常见的格式化 XML 文档有很好的支持。

首先是 Xpath:

<GeocodeResponse>
    <result>
            <type>street_address</type>

<result>元素是具有<type>节点值的子元素的元素street_address。在 Xpath 中,这表示为:

/*/result/type[. = "street_address"]/..

它对邮政编码的工作方式类似。它是<address_component>前一个<result>节点的子节点,它有一个<type>节点值postal_code和您想要的元素的子节点:

address_component/type[. = "postal_code"]/..

到目前为止,xpaths。运行它所需要做的就是加载 XML 文档、执行路径并读出您感兴趣的值:

$xml = simplexml_load_file($xmlFile);

list($result) = $xml->xpath('/*/result/type[. = "street_address"]/..');
list($postal_code) = $result->xpath('address_component/type[. = "postal_code"]/..');

echo $result->formatted_address, "\nZIP: ", $postal_code->long_name, "\n";

使用您的问题中链接的 XML 文档,这将创建以下输出:

17 Dorchester Street, Springfield, MA 01109, USA
ZIP: 01109

我希望这是有帮助的。

于 2013-03-16T12:48:43.743 回答
0

因此,您链接到的 XML 实际上包含邮政编码。这是一个address_component有孩子type的价值postal_code。恕我直言,最简单的方法是 XPath:

$d = <<<HER
<GeocodeResponse>
  <!-- yada... --> 
  <result>
    <!-- yada --> 
    <address_component>
        <long_name>01109</long_name>
        <short_name>01109</short_name>
        <type>postal_code</type>
    </address_component>
    <!-- yada --> 
   </result>
   <!-- yoda --> 
</GeocodeResponse>
HER;

$doc = new DomDocument();
$doc->loadXML($d);
$path = new DomXPath($doc);
/*
the query translates->
   // = all nodes
   address_component = which have the type of 'address_component'
   type = the children of the address_component with the type 'type'   
   [text() = "postal_code"] = but only the type's with the value 'postal_code'
   /preceding-sibling = all nodes before this one in the same parent
   ::*[1] = the one most adjacent of the sibling
*/

$p = $path->query(
  '//address_component/type[text() = "postal_code"]/preceding-sibling::*[1]');
$newUrl = 'http://mysite.com?process='.$p->item(0)->nodeValue;
print($newUrl);
于 2013-03-16T12:26:40.547 回答