четвер, 5 березня 2009 р.

Розбираємо результат Yahoo geocodes

Є у Yahoo такий сервіс, як по адресі визначити географічні координати місця. Причому задавати можна досить загальну адресу. Наприклад при пошуку за адресою Kiev вертаються координати приблизно Бессарабського ринку. Детальніше про сам сервіс можна прочитати тут.
Результат цей сервіс повертає в XML форматі.
<?xml version="1.0"?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:maps"
xsi:schemaLocation="urn:yahoo:maps http://api.local.yahoo.com/MapsService/V1/GeocodeResponse.xsd">
<Result precision="zip">
<Latitude>50.441380</Latitude>
<Longitude>30.522495</Longitude>
<Address></Address>
<City>Kiev</City>
<State>Ukraine</State>
<Zip></Zip>
<Country>UA</Country>
</Result>
</ResultSet>
Щоб дістати значення Latitude і Longitude використаємо XPath. Так як в xml вказаний namespace, то потрібно врахувати це при створені документу
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); //вмикаємо підтримку namespace
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(inputStream);
а також при написанні xpath запиту - хоч в самому xml документі перфікс дефолтового namespace не вказується для тегів, при написанні xpath запитів їх потрібно вкзувати. В нашому випадку превіксом являється urn:yahoo:maps. Таким чином запит для отримання значення Latitude буде мати вигляд
//urn:yahoo:maps:Result/urn:yahoo:maps:Latitude
Часом в результаті може бути кілька записів, наприклад в різних країнах можуть бути міста з однаковою назвою. В такому випадку до запиту можна добавити фільтр який буде вибирати тільки результати з України
//urn:yahoo:maps:Result/urn:yahoo:maps:Latitude[following-sibling::urn:yahoo:maps:State='Ukraine']