【问题标题】:SimpleXML: Working with XML containing namespacesSimpleXML:使用包含命名空间的 XML
【发布时间】:2011-01-02 03:47:46
【问题描述】:

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

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

【问题讨论】:

    标签: php xml namespaces simplexml


    【解决方案1】:

    这就是我不使用 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;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 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

      【讨论】:

      • 谢谢,我得出了同样的结论 $geo = $feed->xpath('//gml:pos');echo $geo[0];也许另一种方式无法处理嵌套的命名空间元素
      • 实际上,我拼错了一些东西。$geo->point 应该是 $geo->Point(大写)
      【解决方案3】:
      echo $geo->pos[0];
      

      【讨论】:

      • 此方法不会访问命名空间
      猜你喜欢
      • 2013-04-30
      • 1970-01-01
      • 2010-11-11
      • 2010-10-10
      • 2016-09-22
      相关资源
      最近更新 更多