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 相关文章推荐
构建简单的Webmail系统
Oct 09 PHP
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
Nov 12 PHP
php 使用post,get的一种简洁方式
Apr 25 PHP
php基础教程 php内置函数实例教程
Aug 21 PHP
php引用计数器进行垃圾收集机制介绍
Sep 19 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
php include和require的区别深入解析
Jun 17 PHP
PHP实现的多彩标签效果代码分享
Aug 21 PHP
php过滤HTML标签、属性等正则表达式汇总
Sep 22 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 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 session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
javascript 运算数的求值顺序
2011/08/23 Javascript
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
子页向父页传值示例
2013/11/27 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
Python调用C++程序的方法详解
2017/01/24 Python
Scrapy的简单使用教程
2017/10/24 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
体现团队精神的口号
2014/06/06 职场文书
学校督导评估方案
2014/06/10 职场文书
公民授权委托书
2014/10/15 职场文书
股东大会通知
2015/04/24 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang
Python Django获取URL中的数据详解
2021/11/01 Python
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB
使用scrapy实现增量式爬取方式
2022/06/21 Python
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers