遍历simplexml_load_file从 Google Maps REST API 接收的具有非唯一元素名称的对象


Traverse simplexml_load_file object recieved from Google Maps REST API with non-unique element names

我正在尝试获取<address_component>元素中的值,该值对应于Google maps REST API返回的XML中的<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>.

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

如果它们是唯一命名的,那么情况很简单:

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

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

谁能阐明正确的方法。

谢谢

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

下面将为您提供一个包含您要查找的<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);
}