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 getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
php中关于普通表单多文件上传的处理方法
Mar 25 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
给大家分享几个常用的PHP函数
Jan 15 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 PHP
PHP实现的二分查找算法实例分析
Dec 19 PHP
thinkPHP5框架分页样式类完整示例
Sep 01 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 01 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
显示程序执行时间php函数代码
2013/08/29 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
详解React中setState回调函数
2018/06/14 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
Vue 组件注册实例详解
2019/02/23 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python连接oracle数据库实例
2014/10/17 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Python中的函数作用域
2018/05/07 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
阿里旅行:飞猪
2017/01/05 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
高中自我评价分享
2013/12/05 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
大学生村官个人总结
2015/02/15 职场文书
驻村工作简报
2015/07/20 职场文书
放飞理想主题班会
2015/08/14 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js