使用DOM,PHP处理xml时的奇怪问题

时间:2010-09-22 07:40:07

标签: php xml dom

我想像这样处理一个xml:

<GeocodeResponse> 
 <status>OK</status> 
 <result> 
  <type>street_address</type> 
  <address_component> 
   <long_name>Beijing</long_name> 
   <short_name>Beijing</short_name> 
   <type>locality</type> 
   <type>political</type> 
  </address_component> 
  <address_component> 
   <long_name>Beijing</long_name> 
   <short_name>Beijing</short_name> 
   <type>administrative_area_level_1</type>
   <type>political</type> 
  </address_component>  
 </result> 
</GeocodeResponse>

我想做的是将节点循环到&lt; address_component&gt;

使用时:

$doc = new DOMDocument();
$doc->loadXML($contents);

$addresses=$doc->getElementsByTagName("address_component");

foreach($addresses as $address){

    $nodes = $address->$childNodes; //error arise here

    for($i=0;$i<count($nodes);$i++){
        //do work
    }

}

它始终显示:

    Fatal error: Cannot access empty property in C:\xampp\htdocs\read.php on line

$nodes = $address->$childNodes;

虽然它可以正常使用以下代码:

        $doc = new DOMDocument();
        $doc->loadXML($contents);

        $addresses=$doc->getElementsByTagName("address_component");
        for($k=0;$k<$addresses->length;$k++){
        $type_elements = $addresses->item($k)->getElementsByTagName('type');

            //do work        
        } 

我看不出这两种方法的区别,在第一个例子中,当我做'foreach'时,我得到的$ address是一个&lt; address_component&gt;像这样的元素:

  <address_component> 
   <long_name>Beijing</long_name> 
   <short_name>Beijing</short_name> 
   <type>administrative_area_level_1</type>
   <type>political</type> 
  </address_component> 

正确?

当然它有$ childNodes,如&lt; long_name&gt;,&lt; short_name&gt;等等。

但为什么我得到空房产?

1 个答案:

答案 0 :(得分:2)

由于您要访问某个媒体资源,因此childNodes不应该$

$nodes = $address->childNodes;

当您将$放在前面时,PHP会尝试将其评估为variable

在旁注中,您似乎已将error_reporting禁用或设置得太低,否则您会看到通知告诉您Notice: Undefined variable: childNodes。您应该在开发计算机上设置error_reporting(-1)以启用所有错误。