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

そして、 http://mysite.com? process = 01109のような郵便番号「01109」を含む新しいURLを作成し、 このサイトを開きます。

誰か助けてくれませんか!

4

3 に答える 3

0

simplexmlとxpathを使用してpostal_codeshort_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"]/..

また、郵便番号についても同様に機能します。node-value である子を持つ<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持つ子を持つです。そこにたどり着く最も簡単な方法は、私見ですが、XPathです。typepostal_code

$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 に答える