0

我试图从 Google 地图 REST API 返回的 XML中获取<address_component>对应的元素内的值。<type>postal_code</type>

例如,在下面:

    ...

  <result>    
    <type>
      route
    </type>    
    <formatted_address>
      Rose Ln, Liverpool, Merseyside L18 5ED, UK
    </formatted_address>    
    <address_component>      
      <long_name>
        Rose Ln
      </long_name>      
      <short_name>
        Rose Ln
      </short_name>      
      <type>
        route
      </type>      
    </address_component>    
    <address_component>      
      <long_name>
        Liverpool
      </long_name>      
      <short_name>
        Liverpool
      </short_name>      
      <type>
        locality
      </type>      
      <type>
        political
      </type>      
    </address_component>    
    <address_component>      
     ...      
    </address_component>    
    <address_component>      
    ...
    </address_component>    
    <address_component>      
      <long_name>
        L18 5ED
      </long_name>      
      <short_name>
        L18 5ED
      </short_name>      
      <type>
        postal_code
      </type>      
    </address_component>    
    <address_component>      
    ...      
    </address_component>    
   ...    
  </result>

  ... more result elements

我们看到了其中一个<result>元素。嵌套在里面的是多个<address_component>元素。其中之一是<type>postal_code</type>

我的问题是我将如何区分这些相同的命名元素并仅选择归因于它的<address_component>元素<type>postal_code</type>

如果它们被唯一命名,那将是一个简单的例子:

foreach ($address_rsponse->result as $address_option) {
    $val = $address_option->some_unique_name;      
}

但是,当命名相同时,我对通过子元素挑选元素的方法感到困惑。

任何人都可以阐明正确的方法。

谢谢

4

1 回答 1

1

您可以将XPath与 SimpleXML ( docs ) 一起使用。

以下将为您提供一个包含<address_component>您正在寻找的元素的数组。

$address_rsponse->result->xpath(
    'address_component[normalize-space(type)="postal_code"]')

如果您想遍历<result>元素,以下将为您提供一个包含您要查找的元素的数组<address_component>,并为每个元素输出第一个<result>

foreach ($address_rsponse->result as $result) {
    $postal_codes = $result->xpath('address_component[normalize-space(type)="postal_code"]');
    // Do whatever with the postal code(s)
    echo trim($postal_codes[0]->long_name);
}
于 2012-04-27T17:44:09.277 回答