加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php simplexmlElement操作xml的命名空间实现代码

发布时间:2020-05-28 21:29:43 所属栏目:PHP 来源:互联网
导读:这是今天中午发生的事情,有人在群里求助,比如xml中如果标记是xx:xxxxcontent/xx:xxxx这样的情况下,取不到 xx:xxxx 为下标的值。

看了这个问题,第一个反应就是namespace的关系,但我从来没有使用simplexml操作过namespace,于是就翻开手册查了一下资料,问题并没有解决,最终是通过google解决了该问题。 提问题的朋友贴出了数据源,来自于:http://code.google.com/intl/zh-CN/apis/contacts/docs/3.0/developers_guide_protocol.html#retrieving_without_query,数据结构大致如下:
<div class="codetitle"><a style="CURSOR: pointer" data="20731" class="copybut" id="copybut20731" onclick="doCopy('code20731')"> 代码如下:<div class="codebody" id="code20731">

liz@gmail.com
2008-12-10T10:04:15.446Z

Elizabeth Bennet's Contacts





Elizabeth Bennet
liz@gmail.com

Contacts
1</openSearch:totalResults>
1</openSearch:startIndex>
25</openSearch:itemsPerPage>

http://www.google.com/m8/feeds/contacts/liz%40gmail.com/base/c9012de
2008-12-10T04:45:03.331Z
2008-12-10T04:45:03.331Z</app:edited>

Fitzwilliam Darcy

Fitzwilliam Darcy</gd:fullName>
</gd:name>



456 </gd:phoneNumber>





这个结构在上面的地址里有,这个是我格式化过的XML数据,现在要取得类似于“ 456 </gd:phoneNumber> ”中的值。 最终代码如下:
<div class="codetitle"><a style="CURSOR: pointer" data="12445" class="copybut" id="copybut12445" onclick="doCopy('code12445')"> 代码如下:<div class="codebody" id="code12445">
$x = new SimpleXmlElement($str);
foreach($x->entry as $t){
echo $t->id . "
";
echo $t->updated . "
";
$namespaces = $t->getNameSpaces(true);
$gd = $t->children($namespaces['gd']);
echo $gd->phoneNumber;
}

当然,如果不象上面这样写,也可以写成这样:
<div class="codetitle"><a style="CURSOR: pointer" data="90419" class="copybut" id="copybut90419" onclick="doCopy('code90419')"> 代码如下:<div class="codebody" id="code90419">
$x = new SimpleXmlElement($str);
foreach($x->entry as $t){
echo $t->id . "
";
echo $t->updated . "
";
//$namespaces = $t->getNameSpaces(true);
//注意这里与上面一段的区别
$gd = $t->children('http://schemas.google.com/g/2005');
echo $gd->phoneNumber;
}

只是象第二种写法就属于硬编码了,这样不太好,万一哪天有变化,还得再更改N多代码。
问题接踵而来,比如象下面这段:
<div class="codetitle"><a style="CURSOR: pointer" data="29940" class="copybut" id="copybut29940" onclick="doCopy('code29940')"> 代码如下:<div class="codebody" id="code29940">

</event:sessionKey>
Learn QB in Minutes</event:sessionName>
9</event:sessionType>
</event:hostWebExID>
02/12/2009</event:startDate>
02/12/2009</event:endDate>
11</event:timeZoneID>
30</event:duration>
</event:description>
NOT_INPROGRESS</event:status>
</event:panelists>
PUBLIC</event:listStatus>
</event:event>

这种非标准的XML,没有定义命名空间,怎么办?在这种情况下,其实SimpleXmlElement就已经直接可以解决了,但是会报warnging,因为他认为event这个命名空间不存在。
解决方法是:
<div class="codetitle"><a style="CURSOR: pointer" data="11377" class="copybut" id="copybut11377" onclick="doCopy('code11377')"> 代码如下:<div class="codebody" id="code11377">
$xml = @new SimpleXmlElement($str);//在前面加@抑止错误。
echo "

"; 
print_r($xml);

目前看来,这种解决方法比较好。 PHP SimpleXML 函数 相关资料
//www.jb51.cc/w3school/php/php_ref_simplexml.htm
PHP SimpleXML
//www.jb51.cc/w3school/php/php_xml_simplexml.htm

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读