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 htmlentities和htmlspecialchars 的区别
Aug 18 PHP
php 图像函数大举例(非原创)
Jun 20 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
Jan 14 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
php抽象类用法实例分析
Jul 07 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
Aug 14 PHP
PHP 访问数据库配置通用方法(json)
May 20 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 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
安装APACHE
2007/01/15 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
PHP图片加水印实现方法
2016/05/06 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
基于python log取对数详解
2018/06/08 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
python kafka 多线程消费者&amp;手动提交实例
2019/12/21 Python
Python实现异步IO的示例
2020/11/05 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
DTD的含义以及作用
2014/01/26 面试题
优秀团员个人的自我评价
2013/10/02 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL