如何使用具有命名空间的PHP解析XML响应?

时间:2012-08-07 09:15:25

标签: php xml

我正在尝试使用PHP中的simplexml_load_string解析其中包含名称空间的XML文件。 xml响应的示例如下:http://pastie.org/4404714

通常我会使用simplexml_load_string命令解析它,然后将结果转储出来以获得一个易于阅读的好树,以便我可以访问这些对象。但是,在这种情况下执行此操作时,所有数据都不会显示。 AttributeSets下面的段根本不显示。我必须输出原始xml甚至看到它们。

我读了其他类似的stackoverflow答案,我可以忽略标签中的命名空间部分,但我也无法让它工作。请有人帮忙。例如,如何从此响应中打印出作者,高度或版本。感谢

2 个答案:

答案 0 :(得分:0)

也许this question here on SO会帮助你。

基本上答案表明你必须为你使用的每个simpleXMLElement对象注册命名空间。

来自链接问题的示例:

$xml = new SimpleXMLElement($r);
$xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');

foreach($xml->xpath('//e:event') as $event) {
    $event->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');
    var_export($event->xpath('//e:sessionKey'));
}

或者正如另一个解决方案所解释的那样:它在没有registerXPathNamespace和xpath查询中的完整名称空间前缀的情况下工作:

$xml = new SimpleXMLElement($r);

foreach($xml->xpath('//event:event') as $event) {
    var_export($event->xpath('event:sessionKey'));
}

答案 1 :(得分:0)

经过大量研究,我发现了两种解决方法。一个是正​​确的方法,另一个是快速和肮脏的。 This is the site解释了如何以正确的方式做到这一点。我能够在PHP中使用simple_xml_load_string解析字符串,然后获取包含不同命名空间的对象的子节点,就像在该页面上的示例中一样。那是痛苦但可行的。

最后,由于我只需要一个简单,快速的解决方案,我获取原始XML数据并执行str_replace('ns2:','',$rawxml),然后使用simple_xml_load_string进行解析,它就像一个魅力。我只是$call->it->like->this

有些人不喜欢这个解决方案,但命名空间用于避免重复字段,并且由于我解析和使用数据的方式的性质,这对我来说不是问题。