我正在尝试使用PHP中的simplexml_load_string解析其中包含名称空间的XML文件。 xml响应的示例如下:http://pastie.org/4404714
通常我会使用simplexml_load_string命令解析它,然后将结果转储出来以获得一个易于阅读的好树,以便我可以访问这些对象。但是,在这种情况下执行此操作时,所有数据都不会显示。 AttributeSets下面的段根本不显示。我必须输出原始xml甚至看到它们。
我读了其他类似的stackoverflow答案,我可以忽略标签中的命名空间部分,但我也无法让它工作。请有人帮忙。例如,如何从此响应中打印出作者,高度或版本。感谢
答案 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
。
有些人不喜欢这个解决方案,但命名空间用于避免重复字段,并且由于我解析和使用数据的方式的性质,这对我来说不是问题。