简单XML:使用包含命名空间的 XML
-
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 中处理名称空间的更多方法,例如:
Stuart Herbert 论 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;
}
}
}
不隶属于 StackOverflow