php simplexmlElement操作xml的命名空间实现代码
2015-01-24信息快讯网
提问题的朋友贴出了数据源,来自于: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>[email protected]</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>[email protected]</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 函数 相关资料
http://www.jb51.net/w3school/php/php_ref_simplexml.htm
PHP SimpleXML
http://www.jb51.net/w3school/php/php_xml_simplexml.htm
iis下php mail函数的sendmail配置方法(官方推荐)
PHP中return 和 exit 、break和contiue 区别与用法
php 的加密函数 md5,crypt,base64_encode 等使用介绍
simplehtmldom Doc api帮助文档
Notice: Trying to get property of non-object problem(PHP)解决办法
PHP中将字符串转化为整数(int) intval() printf() 性能测试
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
JS中encodeURIComponent函数用php解码的代码
MySQL时间字段究竟使用INT还是DateTime的说明
一些需要禁用的PHP危险函数(disable_functions)
php 无法加载mysql的module的时候的配置的解决方案引发的思考
PHP中创建空文件的代码[file_put_contents vs touch]
用phpmailer实现简单openvpn用户认证的实现代码
比file_get_contents稳定的curl_get_contents分享
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
php中使用Curl、socket、file_get_contents三种方法POST提交数据
PHP strncasecmp字符串比较的小技巧
array_multisort实现PHP多维数组排序示例讲解
php array_unique之后json_encode需要注意
PHP中simplexml_load_string函数使用说明
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
php数据入库前清理 注意php intval与mysql的int取值范围不同
浅谈PHP Extension的开发――基础篇第1/2页
php iconv() : Detected an illegal character in input string
php printf输出格式使用说明
zen cart新进商品的随机排序修改方法
使用bcompiler对PHP文件进行加密的代码
php visitFile()遍历指定文件夹函数
ubuntu 编译安装php 5.3.3+memcache的方法
PHP中的integer类型使用分析
UCenter中的一个可逆加密函数authcode函数代码
php将会员数据导入到ucenter的代码
php file_get_contents函数轻松采集html数据
Search File Contents PHP 搜索目录文本内容的代码