php simplexmlElement操作xml的命名空间实现代码


Posted in PHP onJanuary 04, 2011

看了这个问题,第一个反应就是namespace的关系,但我从来没有使用simplexml操作过namespace,于是就翻开手册查了一下资料,问题并没有解决,最终是通过google解决了该问题。

提问题的朋友贴出了数据源,来自于:http://code.google.com/intl/zh-CN/apis/contacts/docs/3.0/developers_guide_protocol.html#retrieving_without_query,数据结构大致如下:

<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"CUMBRHo_fip7ImA9WxRbGU0."'> 
<id>liz@gmail.com</id> 
<updated>2008-12-10T10:04:15.446Z</updated> 
<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' /> 
<title>Elizabeth Bennet's Contacts</title> 
<link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full' /> 
<link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full' /> 
<link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/batch' /> 
<link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full?max-results=25' /> 
<author> 
<name>Elizabeth Bennet</name> 
<email>liz@gmail.com</email> 
</author> 
<generator version='1.0' uri='http://www.google.com/m8/feeds'> Contacts </generator> 
<openSearch:totalResults>1</openSearch:totalResults> 
<openSearch:startIndex>1</openSearch:startIndex> 
<openSearch:itemsPerPage>25</openSearch:itemsPerPage> 
<entry gd:etag='"Qn04eTVSLyp7ImA9WxRbGEUORAQ."'> 
<id> http://www.google.com/m8/feeds/contacts/liz%40gmail.com/base/c9012de </id> 
<updated>2008-12-10T04:45:03.331Z</updated> 
<app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-10T04:45:03.331Z</app:edited> 
<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' /> 
<title>Fitzwilliam Darcy</title> 
<gd:name> 
<gd:fullName>Fitzwilliam Darcy</gd:fullName> 
</gd:name> 
<link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/liz%40gmail.com/c9012de' gd:etag='"KTlcZWs1bCp7ImBBPV43VUV4LXEZCXERZAc."' /> 
<link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/c9012de' /> 
<link rel='edit' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/c9012de' /> 
<gd:phoneNumber rel='http://schemas.google.com/g/2005#home' primary='true'> 456 </gd:phoneNumber> 
<gd:extendedProperty name='pet' value='hamster' /> 
<gContact:groupMembershipInfo deleted='false' href='http://www.google.com/m8/feeds/groups/liz%40gmail.com/base/270f' /> 
</entry> 
</feed>

这个结构在上面的地址里有,这个是我格式化过的XML数据,现在要取得类似于“<gd:phoneNumber rel='http://schemas.google.com/g/2005#home' primary='true'> 456 </gd:phoneNumber> ”中的值。

最终代码如下:

$x = new SimpleXmlElement($str); 
foreach($x->entry as $t){ 
echo $t->id . "<br >"; 
echo $t->updated . "<br />"; 
$namespaces = $t->getNameSpaces(true); 
$gd = $t->children($namespaces['gd']); 
echo $gd->phoneNumber; 
}

当然,如果不象上面这样写,也可以写成这样:
$x = new SimpleXmlElement($str); 
foreach($x->entry as $t){ 
echo $t->id . "<br >"; 
echo $t->updated . "<br />"; 
//$namespaces = $t->getNameSpaces(true); 
//注意这里与上面一段的区别 
$gd = $t->children('http://schemas.google.com/g/2005'); 
echo $gd->phoneNumber; 
}

只是象第二种写法就属于硬编码了,这样不太好,万一哪天有变化,还得再更改N多代码。
问题接踵而来,比如象下面这段:
<event:event> 
<event:sessionKey></event:sessionKey> 
<event:sessionName>Learn QB in Minutes</event:sessionName> 
<event:sessionType>9</event:sessionType> 
<event:hostWebExID></event:hostWebExID> 
<event:startDate>02/12/2009</event:startDate> 
<event:endDate>02/12/2009</event:endDate> 
<event:timeZoneID>11</event:timeZoneID> 
<event:duration>30</event:duration> 
<event:description></event:description> 
<event:status>NOT_INPROGRESS</event:status> 
<event:panelists></event:panelists> 
<event:listStatus>PUBLIC</event:listStatus> 
</event:event>

这种非标准的XML,没有定义命名空间,怎么办?在这种情况下,其实SimpleXmlElement就已经直接可以解决了,但是会报warnging,因为他认为event这个命名空间不存在。
解决方法是:
$xml = @new SimpleXmlElement($str);//在前面加@抑止错误。 
echo "<pre>"; 
print_r($xml);

目前看来,这种解决方法比较好。

PHP SimpleXML 函数 相关资料
https://3water.com/w3school/php/php_ref_simplexml.htm
PHP SimpleXML
https://3water.com/w3school/php/php_xml_simplexml.htm

PHP 相关文章推荐
用PHP生成html分页列表的代码
Mar 18 PHP
关于BIG5-HKSCS的解决方法
Mar 20 PHP
浅谈PHP强制类型转换,慎用!
Jun 06 PHP
php使用curl访问https示例分享
Jan 17 PHP
PHP采用get获取url汉字出现乱码的解决方法
Nov 13 PHP
PHP实现股票趋势图和柱形图
Feb 07 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
Feb 23 PHP
Yii2使用自带的UploadedFile实现的文件上传
Jun 20 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
PHP中有关长整数的一些操作教程
Sep 11 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
Apr 23 PHP
array_multisort实现PHP多维数组排序示例讲解
Jan 04 #PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 #PHP
PHP 设置MySQL连接字符集的方法
Jan 02 #PHP
php array_unique之后json_encode需要注意
Jan 02 #PHP
从php核心代码分析require和include的区别
Jan 02 #PHP
深入理解PHP之require/include顺序 推荐
Jan 02 #PHP
PHP中foreach循环中使用引用要注意的地方
Jan 02 #PHP
You might like
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
详解JavaScript函数
2015/12/01 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
微信小程序仿通讯录功能
2020/04/09 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
js实现计算器功能
2020/08/10 Javascript
Python3访问并下载网页内容的方法
2015/07/28 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
Python提取网页中超链接的方法
2016/09/18 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
Python中logger日志模块详解
2020/08/04 Python
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
链表面试题-一个链表的结点结构
2015/05/04 面试题
挂牌仪式策划方案
2014/05/18 职场文书
关于爱国的标语
2014/06/24 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
恰同学少年观后感
2015/06/08 职场文书