SimpleXML ( Симплексный ):Работа с XML, содержащим пространства имен

StackOverflow https://stackoverflow.com/questions/2014835

  •  19-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить доступ к географической информации с помощью Google-picasa API.Это исходный XML-файл:

<georss:where>
  <gml:Point>
    <gml:pos>35.669998 139.770004</gml:pos>
  </gml:Point>
</georss:where>

Я уже зашел так далеко, с:

$ns_geo=$item->children($namespace['georss']);
$geo=$ns_geo->children($namespace['gml']);

var_dump($geo) будет выводить

object(SimpleXMLElement)#34 (1) { 
  ["Point"]=> object(SimpleXMLElement)#30 (1) { 
    ["pos"]=> string(18) "52.373801 4.890935" 
  } 
} 

но

echo (string)$geo->position or (string)$geo->position->pos; 

это ничего мне не даст.Есть ли что-то очевидное, что я делаю неправильно?

Это было полезно?

Решение

Вы могли бы работать с XPath и registerXPathNamespace():

$xml->registerXPathNamespace("georss", "http://www.georss.org/georss");
$xml->registerXPathNamespace("gml", "http://www.opengis.net/gml");
$pos = $xml->xpath("/georss:where/gml:Point/gml:pos");

Из документов, курсив мой:

registerXPathNamespace [...] Создает контекст prefix/ns для следующего запроса XPath.

Дополнительные способы обработки пространств имен в SimpleXML можно найти здесь, например:
Стюарт Герберт На PHP - Использование SimpleXML Для анализа RSS-каналов

Другие советы

echo $geo->pos[0];

Вот как я это сделал, не используя xpath:

$georss = $photo->children('http://www.georss.org/georss');
$coords;
if($georss->count()>0) {
    $gml = $georss->children('http://www.opengis.net/gml');
    if($gml->count()>0) {
        if(isset($gml->Point->pos)) {
            $coords = $gml->Point->pos;
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top