Получить данные (почтовый индекс) из 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
Я надеюсь, что это полезно.