0

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

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

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

4

2 回答 2

0

也许这个关于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'));
}
于 2012-08-07T09:22:12.707 回答
0

经过大量研究,我找到了两种解决方法。一种是正确的方法,另一种是快速而肮脏的。 这是解释如何以正确方式进行操作的网站。我能够使用simple_xml_load_stringPHP 解析字符串,然后获取包含不同命名空间的对象的子对象,就像该页面上的示例一样。这是一个痛苦但可行的。

最后,因为我只需要一个简单、快速的解决方案,所以我获取了原始 XML 数据并做了一个str_replace('ns2:','',$rawxml),然后用它解析它,simple_xml_load_string它就像一个魅力。我只是$call->it->like->this

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

于 2012-08-07T21:57:59.473 回答