首頁 >php教程 >php手册 >php simplexmlElement操作xml的命名空间实现代码

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

WBOY
WBOY原創
2016-06-06 20:35:361282瀏覽

这是今天中午发生的事情,有人在群里求助,比如xml中如果标记是xx:xxxxcontent/xx:xxxx这样的情况下,取不到 xx:xxxx 为下标的值。

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

提问题的朋友贴出了数据源,来自于:#retrieving_without_query,数据结构大致如下:

复制代码 代码如下:



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

Elizabeth Bennet's Contacts





Elizabeth Bennet
liz@gmail.com

Contacts
1
1
25

%40gmail.com/base/c9012de
2008-12-10T04:45:03.331Z
2008-12-10T04:45:03.331Z

Fitzwilliam Darcy

Fitzwilliam Darcy




456





这个结构在上面的地址里有,这个是我格式化过的XML数据,现在要取得类似于“ 456 ”中的值。

最终代码如下:

复制代码 代码如下:


$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;
}


当然,服务器空间,香港服务器,美国服务器,如果不象上面这样写,也可以写成这样:

复制代码 代码如下:


$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多代码。
问题接踵而来,比如象下面这段:

复制代码 代码如下:




Learn QB in Minutes
9

02/12/2009
02/12/2009
11
30

NOT_INPROGRESS

PUBLIC


这种非标准的XML,没有定义命名空间,怎么办?在这种情况下,其实SimpleXmlElement就已经直接可以解决了,但是会报warnging,因为他认为event这个命名空间不存在。
解决方法是:

复制代码 代码如下:


$xml = @new SimpleXmlElement($str);//在前面加@抑止错误。
echo "

"; <br>print_r($xml); <br> <br>目前看来,这种解决方法比较好。 <br><br>PHP SimpleXML 函数 相关资料<br><br>PHP SimpleXML<br>



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn