php simplexmlElement操作xml的命名空间实现代码 |
本文标签:simplexmlElement 看了这个问题,第一个反应就是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 Bennets 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 函数 相关资料 http://www.jb51.net/w3school/php/php_ref_simplexml.htm PHP SimpleXML http://www.jb51.net/w3school/php/php_xml_simplexml.htm |