解析xml问题

时间:2010-08-19 14:53:15

标签: php xml parsing

我正在尝试使用PHP和simplexml_load_file解析它,但它没有显示任何内容?

http://developer.multimap.com/API/geocode/1.2/OA10081917657704697?qs=Heaton&countryCode=GB

我哪里错了?感谢

$results = simplexml_load_file($url);
foreach($results->Location() as $location) {
  foreach($location->Address() as $address) {
    foreach($address->Areas() as $areas) {
       foreach($areas->Area as $area) {
          echo $area->area;
       echo "<br />";
       }
     }
   }
}

1 个答案:

答案 0 :(得分:1)

如果您启用了error_reportingdisplay_errors,则会看到有

Fatal error: Call to undefined method SimpleXMLElement::Location()

您正尝试使用Method调用访问元素,例如

foreach($results->Location() as $location) {

什么时候应该

foreach($results->Location as $location) {

其他元素相同。
此外,它不是$area->area而只是$area

完整的固定代码:

$results = simplexml_load_file($url);
foreach($results->Location as $location) {
  foreach($location->Address as $address) {
    foreach($address->Areas as $areas) {
       foreach($areas->Area as $area) {
          echo $area;
       echo "<br />";
       }
     }
   }
}

在旁注中,您可以在使用XPath时获取文档中的所有Area元素,而不会像疯了一样循环。但是,由于元素是命名空间,因此必须首先使用前缀注册该命名空间才能使用XPath:

$results = simplexml_load_file($url);
$results->registerXPathNamespace('d', 'http://clients.multimap.com/API');
$areas = $results->xpath('//d:Area');
foreach($areas as $area) {
    echo "$area<br/>";
}

另一种克服所有元素的方法(虽然比使用XPath更少的格式)是使用Iterator遍历DOM树:

$elements = new RecursiveIteratorIterator(
    simplexml_load_file($url, 'SimpleXmlIterator'));

foreach($elements as $element) {
    if($element->getName() === 'Area') {
        echo $element;
    }
}