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


How do I parse an XML response with PHP that has namespaces?

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

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

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

也许SO

上的这个问题会对你有所帮助。

基本上,答案建议的是,您必须为您使用的每个简单XMLElement对象注册命名空间。

链接问题中的示例:

$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'));
}

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

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

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