Я пытаюсь добраться до геоинформации с API google-picasa. Это оригинальный 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 […] Создает префикс / 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; } } }