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 相关文章推荐
在普通HTTP上安全地传输密码
Jul 21 PHP
php地址引用(php地址引用的效率问题)
Mar 23 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
php实现session共享的实例方法
Sep 19 PHP
php正则表达式使用方法整理集合
Jan 31 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 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对大文件进行读取操作的实现代码
2013/01/23 PHP
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
python删除列表中重复记录的方法
2015/04/28 Python
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
python区分不同数据类型的方法
2019/10/14 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
python通过链接抓取网站详解
2019/11/20 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
本科生求职简历的自我评价
2013/10/21 职场文书
机关财务管理制度
2014/01/17 职场文书
三年级上册科学教学计划
2015/01/21 职场文书