SimpleXML:使用包含名称空间的XML

时间:2010-01-06 17:24:38

标签: php xml namespaces simplexml

我正试图通过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; 

什么都不给我。有什么明显的东西我做错了吗?

3 个答案:

答案 0 :(得分:4)

您可以使用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 [...]为下一个XPath查询创建前缀/ ns上下文

可以在此处找到更多处理SimpleXML中命名空间的方法,例如:
Stuart Herbert On PHP - Using SimpleXML To Parse RSS Feeds

答案 1 :(得分:0)

echo $geo->pos[0];

答案 2 :(得分: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;
        }
    }
}