看了这个问题,第一个反应就是namespace的关系,但我从来没有使用simplexml操作过namespace,于是就翻开手册查了一下资料,问题并没有解决,最终是通过google解决了该问题。 提问题的朋友贴出了数据源,来自于:http://code.google.com/intl/zh-CN/apis/contacts/docs/3.0/developers_guide_protocol.html#retrieving_without_query,数据结构大致如下:
liz@gmail.com 2008-12-10T10:04:15.446Z Elizabeth Bennet's Contacts Elizabeth Bennet liz@gmail.com Contacts 1 1 25 http://www.google.com/m8/feeds/contacts/liz%40gmail.com/base/c9012de 2008-12-10T04:45:03.331Z 2008-12-10T04:45:03.331Z Fitzwilliam Darcy Fitzwilliam Darcy 456
这个结构在上面的地址里有,这个是我格式化过的XML数据,现在要取得类似于“
456 ”中的值。
最终代码如下:
$x = new SimpleXmlElement($str); foreach($x->entry as $t){ echo $t->id . " "; echo $t->updated . " "; $namespaces = $t->getNameSpaces(true); $gd = $t->children($namespaces['gd']); echo $gd->phoneNumber; }
当然,如果不象上面这样写,也可以写成这样:
$x = new SimpleXmlElement($str); foreach($x->entry as $t){ echo $t->id . " "; echo $t->updated . " "; //$namespaces = $t->getNameSpaces(true); //注意这里与上面一段的区别 $gd = $t->children('http://schemas.google.com/g/2005'); echo $gd->phoneNumber; }
只是象第二种写法就属于硬编码了,这样不太好,万一哪天有变化,还得再更改N多代码。
问题接踵而来,比如象下面这段:
Learn QB in Minutes 9 02/12/2009 02/12/2009 11 30 NOT_INPROGRESS PUBLIC
这种非标准的XML,没有定义命名空间,怎么办?在这种情况下,其实SimpleXmlElement就已经直接可以解决了,但是会报warnging,因为他认为event这个命名空间不存在。
解决方法是:
$xml = @new SimpleXmlElement($str);//在前面加@抑止错误。
echo "
"; <br>print_r($xml); <br> Copy after login
目前看来,这种解决方法比较好。
PHP SimpleXML 函数 相关资料
http://www.jb51.net/w3school/php/php_ref_simplexml.htm PHP SimpleXML
http://www.jb51.net/w3school/php/php_xml_simplexml.htm