2012-08-07 58 views
0

我想解析在PHP中使用simplexml_load_string具有名称空间的XML文件。 xml响应的示例如下:http://pastie.org/4404714如何使用具有名称空间的PHP解析XML响应?

通常我会使用simplexml_load_string命令解析此问题,然后将结果转储出来以获取一个很好的易读树,以便我可以访问这些对象。但是,在这种情况下,所有数据甚至不会显示。 AttributeSets下面的段完全不显示。我必须输出原始的xml才能看到它们。

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

+0

[我如何使用SimpleXML解析包含自定义名称空间的XML?](http://stackoverflow.com/questions/1133897/how-do-i-parse-xml-containing-custom-namespaces-using- simplexml) – vascowhite 2012-08-07 09:18:22

回答

0

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

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

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

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

我读过这个问题并尝试了答案,但我无法弄清楚如何将其应用于我的情况。该示例中的XML布局与我发布的示例中的我的布局不同。有没有人有任何想法如何编写,以便它将与我的示例XML工作? – user1452536 2012-08-07 21:24:14