Разбор XML проблемы - PullRequest
       1

Разбор XML проблемы

1 голос
/ 19 августа 2010

Я пытаюсь разобрать это, используя 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 Ответ

1 голос
/ 19 августа 2010

Если бы вы включили error_reporting и display_errors, вы бы увидели

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

Вы пытаетесь получить доступ к элементам с помощью вызовов методов, например,

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 />";
       }
     }
   }
}

В sidenote вы можете получить все элементы Area в документе без зацикливания при использовании XPath. Однако, поскольку элементы имеют пространство имен, вы должны сначала зарегистрировать это пространство имен с префиксом, чтобы использовать 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) - использовать итератор для обхода дерева DOM:

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

foreach($elements as $element) {
    if($element->getName() === 'Area') {
        echo $element;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...