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 相关文章推荐
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
Sep 11 PHP
Yii2单元测试用法示例
Nov 12 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
Jan 17 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP getDocNamespaces()函数讲解
Feb 03 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存储到Redis的方法
2013/11/04 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
Javascript模板技术
2007/04/27 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
js变量提升深入理解
2016/09/16 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
python清除字符串里非字母字符的方法
2015/07/02 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
python定义类self用法实例解析
2020/01/22 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
Python matplotlib可视化实例解析
2020/06/01 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
给老婆的搞笑检讨书
2014/01/12 职场文书
市场部管理制度
2014/02/02 职场文书
阿德的梦教学反思
2014/02/06 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
国际经济贸易专业自荐信
2014/06/13 职场文书
参观邀请函范文
2015/02/02 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
Redis 常见使用场景
2021/08/30 Redis
阿里云日志过滤器配置日志服务
2022/04/09 Servers