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 相关文章推荐
下载文件的点击数回填
Oct 09 PHP
如何使用PHP往windows中添加用户
Dec 06 PHP
php mssql 日期出现中文字符的解决方法
Mar 10 PHP
php 中英文语言转换类
Sep 07 PHP
使用php显示搜索引擎来的关键词
Feb 13 PHP
CI框架Session.php源码分析
Nov 03 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
PHP生成随机数的方法总结
Mar 01 PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
Oct 15 PHP
PHP的mysqli_set_charset()函数讲解
Jan 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之密码加密的几种方式
2015/07/29 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
使用jquery实现放大镜效果
2014/09/02 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
Vite和Vue CLI的优劣
2021/01/30 Vue.js
Python内建模块struct实例详解
2018/02/02 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
如何利用python进行时间序列分析
2020/08/04 Python
Python hashlib模块的使用示例
2020/10/09 Python
美发活动策划书
2014/01/14 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
文员岗位职责范本
2014/03/08 职场文书
服务质量承诺书
2014/03/27 职场文书
综治工作心得体会
2014/09/11 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫