当前位置:Gxlcms > PHP教程 > phpsimplexmlElement操作xml的命名空间实现代码_PHP教程

phpsimplexmlElement操作xml的命名空间实现代码_PHP教程

时间:2021-07-01 10:21:17 帮助过:33人阅读

看了这个问题,第一个反应就是namespace的关系,但我从来没有使用simplexml操作过namespace,于是就翻开手册查了一下资料,问题并没有解决,最终是通过google解决了该问题。

提问题的朋友贴出了数据源,来自于:http://code.google.com/intl/zh-CN/apis/contacts/docs/3.0/developers_guide_protocol.html#retrieving_without_query,数据结构大致如下:
代码如下:
  1. <br><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.""> <br><id>liz@gmail.com</id> <br><updated>2008-12-10T10:04:15.446Z</updated> <br><category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/contact/2008#contact"> <br><title>Elizabeth Bennet's Contacts</title> <br> <br> <br> <br> <br> <br><name>Elizabeth Bennet</name> <br><email>liz@gmail.com</email> <br> <br><generator version="1.0" uri="http://www.google.com/m8/feeds"> Contacts </generator> <br><opensearch:totalresults>1</opensearch:totalresults> <br><opensearch:startindex>1</opensearch:startindex> <br><opensearch:itemsperpage>25</opensearch:itemsperpage> <br><entry gd:etag=""Qn04eTVSLyp7ImA9WxRbGEUORAQ.""> <br><id> http://www.google.com/m8/feeds/contacts/liz%40gmail.com/base/c9012de </id> <br><updated>2008-12-10T04:45:03.331Z</updated> <br>2008-12-10T04:45:03.331Z <br><category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/contact/2008#contact"> <br><title>Fitzwilliam Darcy</title> <br><gd:name> <br><gd:fullname>Fitzwilliam Darcy</gd:fullname> <br></gd:name> <br> <br> <br> <br><gd:phonenumber rel="http://schemas.google.com/g/2005#home" primary="true"> 456 </gd:phonenumber> <br><gd:extendedproperty name="pet" value="hamster"> <br><gcontact:groupmembershipinfo deleted="false" href="http://www.google.com/m8/feeds/groups/liz%40gmail.com/base/270f"> <br></gcontact:groupmembershipinfo></gd:extendedproperty></category></entry> <br></category></feed> <br> <br>这个结构在上面的地址里有,这个是我格式化过的XML数据,现在要取得类似于“<gd:phonenumber rel="http://schemas.google.com/g/2005#home" primary="true"> 456 </gd:phonenumber> ”中的值。 <br><br>最终代码如下: <br><span style="CURSOR: pointer" onclick="doCopy('code25922')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>$x = new SimpleXmlElement($str); <br>foreach($x->entry as $t){ <br>echo $t->id . "<br>"; <br>echo $t->updated . "<br>"; <br>$namespaces = $t->getNameSpaces(true); <br>$gd = $t->children($namespaces['gd']); <br>echo $gd->phoneNumber; <br>} <br> <br>当然,如果不象上面这样写,也可以写成这样: <br><span style="CURSOR: pointer" onclick="doCopy('code3896')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>$x = new SimpleXmlElement($str); <br>foreach($x->entry as $t){ <br>echo $t->id . "<br>"; <br>echo $t->updated . "<br>"; <br>//$namespaces = $t->getNameSpaces(true); <br>//注意这里与上面一段的区别 <br>$gd = $t->children('http://schemas.google.com/g/2005'); <br>echo $gd->phoneNumber; <br>} <br> <br>只是象第二种写法就属于硬编码了,这样不太好,万一哪天有变化,还得再更改N多代码。 <br>问题接踵而来,比如象下面这段: <br><span style="CURSOR: pointer" onclick="doCopy('code43417')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><event:event> <br><event:sessionkey></event:sessionkey> <br><event:sessionname>Learn QB in Minutes</event:sessionname> <br><event:sessiontype>9</event:sessiontype> <br><event:hostwebexid></event:hostwebexid> <br><event:startdate>02/12/2009</event:startdate> <br><event:enddate>02/12/2009</event:enddate> <br><event:timezoneid>11</event:timezoneid> <br><event:duration>30</event:duration> <br><event:description></event:description> <br><event:status>NOT_INPROGRESS</event:status> <br><event:panelists></event:panelists> <br><event:liststatus>PUBLIC</event:liststatus> <br></event:event> <br> <br>这种非标准的XML,没有定义命名空间,怎么办?在这种情况下,其实SimpleXmlElement就已经直接可以解决了,但是会报warnging,因为他认为event这个命名空间不存在。 <br>解决方法是: <br><span style="CURSOR: pointer" onclick="doCopy('code24854')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>$xml = @new SimpleXmlElement($str);//在前面加@抑止错误。 <br>echo "<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li>"; <br>print_r($xml); <br> <br>目前看来,这种解决方法比较好。 <br><br>PHP SimpleXML 函数 相关资料<br>http://www.gxlcms.com/w3school/php/php_ref_simplexml.htm<br>PHP SimpleXML<br>http://www.gxlcms.com/w3school/php/php_xml_simplexml.htm</li><li><p></p></li><li><p align="left"><span id="url" itemprop="url">http://www.bkjia.com/PHPjc/322686.html</span><span id="indexUrl" itemprop="indexUrl">www.bkjia.com</span><span id="isOriginal" itemprop="isOriginal">true</span><span id="isBasedOnUrl" itemprop="isBasedOnUrl">http://www.bkjia.com/PHPjc/322686.html</span><span id="genre" itemprop="genre">TechArticle</span><span id="description" itemprop="description">看了这个问题,第一个反应就是namespace的关系,但我从来没有使用simplexml操作过namespace,于是就翻开手册查了一下资料,问题并没有解决,...</span></p></li><li> </li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre>

人气教程排行