Получить данные (почтовый индекс) из XML (карты API) и создать URL

Я создал приложение для Android, которое получает gpslocation и создает URL-адрес: 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,

И я хотел бы создать новый URL-адрес, содержащий почтовый индекс "01109", например http://mysite.com/?process=01109 и открыть этот сайт.

Может кто-нибудь мне помочь!

3 ответа

Вы можете получить доступ к короткому имени postal_code, используя simplexml и xpath. Вот рабочий пример:

$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 будет возвращать массив или объект в переменные вместо строки при печати (что может привести к путанице при тестировании).

Таким образом, 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);

Чтобы получить конкретные данные из ответа геокодирования googleapis, вам нужно найти не только элемент по его имени, но и по содержимому.

Это можно легко сделать с помощью Xpath. К счастью, расширение SimpleXML в PHP имеет хорошую поддержку для чтения таких распространенных форматированных XML-документов.

Сначала для Xpath:

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

<result> Элемент это элемент, который имеет дочерний элемент <type> какое значение узла street_address, В Xpath это выражается как:

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

И работает аналогично для ZIP-кода. Это <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

Я надеюсь, что это полезно.

Другие вопросы по тегам