手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

PHP里simplexml_load_string函数一个容易犯晕的地方

首页 > PHP >

以下内容均来自老王。说实话,simplexml的这些问题我以前遇到过,而且还是非常强烈的遇到了。
那时候是08年的事了,项目中与SOAP在交互,返回的都是XML,所以就直接采用了simplexml_load_string了。这时候就会遇到这种问题,比如我拉一个列表,但会有三种情况:1、没数据,2、1条数据,3、正常数据
1、没数据的时候,返回一个空的simplexml Object,
2、一条数据的时候,返回的也是一个simplexml Object,结果集成了这个object的元素
3、数据列表,这时候返回的却是一个Array,每一个元素是simplexml Object,等同于2。
后来我是没办法,就多写了一个函数判断,如果是object,并且不为空,直接把object强制转为array,因为,如果是空的simplexml Object,强制转的话,还是Object,转不了。。。

当时还有一个可恨的事情,我以前可能介绍过,xml在返回的时候,他的形式可能是这样的<test-name>gouki</test-name>,在返回这样的形式时,生成object时,却是test_name,在没有print_r出来时,我死活搞不定。。。后来才发现这个问题,郁闷啊

好了,说了半天,该说说老王的内容了:
这个问题遇到好几次了,今天翻看以前代码的时候看到,便记下来,先用一段代码重现一下问题:

PHP代码
  1. <pre>  
  2. <?php  
  3. $string = <<<EOF  
  4. <data>  
  5. <foo><bar>hello</bar></foo>  
  6. <foo><bar>world</bar></foo>  
  7. </data>  
  8. EOF;  
  9.   
  10. $data = simplexml_load_string($string);  
  11.   
  12. print_r($data);  
  13. print_r($data->foo);  
  14. ?>  
  15. </pre>   

乍一看,结果很让人费解:

XML/HTML代码
  1. SimpleXMLElement Object  
  2. (  
  3.     [foo] => Array  
  4.         (  
  5.             [0] => SimpleXMLElement Object  
  6.                 (  
  7.                     [bar] => hello  
  8.                 )  
  9.             [1] => SimpleXMLElement Object  
  10.                 (  
  11.                     [bar] => world  
  12.                 )  
  13.         )  
  14. )  
  15. SimpleXMLElement Object  
  16. (  
  17.     [bar] => hello  
  18. )  

明明print_r显示foo是一个有两个bar元素的数组,但是最后却仅仅显示了一个bar元素!

原因其实很简单,在如上所示simplexml_load_string的结果里,foo并不是数组,而是一个迭代对象!

可以这样确认:

PHP代码
  1. foreach ($data->foo as $v) print_r($v);  
  2. foreach ($data->children() as $v) print_r($v);  
看来,print_r或者var_dump之类的表象并不完全可信,自己多留心吧。
原文来自:http://hi.baidu.com/thinkinginlamp/blog/item/9dbb15ce7a621632b700c86a.html



本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

Tags: simplexml, 老王

« 上一篇 | 下一篇 »

只显示10条记录相关文章

子域和根域同名cookie的处理 (浏览: 23585, 评论: 0)
Kmeans算法 (浏览: 18778, 评论: 0)
simplexml简单测试 (浏览: 18546, 评论: 0)
php simplexmlElement 操作xml的命名空间 (浏览: 18182, 评论: 1)
MySQL-Proxy的安装配置 (浏览: 16430, 评论: 0)
simplexml xpath (浏览: 13236, 评论: 0)

1条记录访客评论

这问题,怎么说呢 只能说 你没认真 看手册上得示例 以及这函数的返回值 ,它返回的本来就是一个对象...

Post by 初九 on 2013, October 15, 2:00 PM 引用此文发表评论 #1


发表评论

评论内容 (必填):