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 相关文章推荐
phpBB BBcode处理的漏洞
Oct 09 PHP
php下实现农历日历的代码
Mar 07 PHP
PHP5 面向对象程序设计
Feb 13 PHP
将一维或多维的数组连接成一个字符串的php代码
Aug 08 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 PHP
yii框架配置默认controller和action示例
Apr 30 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
form自动提交实例讲解
Jul 10 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
PHP中的浅复制与深复制的实例详解
Oct 26 PHP
laravel5.1 ajax post 传值_token示例
Oct 24 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
smarty section简介与用法分析
2008/10/03 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
Python常用模块用法分析
2014/09/08 Python
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python切片知识解析
2016/03/06 Python
Python 变量类型详解
2018/10/10 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
Python列表操作方法详解
2020/02/09 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
数百万免费的图形资源:Freepik
2020/09/21 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
庆八一活动方案
2014/01/25 职场文书
手机银行营销方案
2014/03/14 职场文书
施工安全责任书范本
2014/07/24 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js