手机
当前位置:查字典教程网 >编程开发 >php教程 >php simplexmlElement操作xml的命名空间实现代码
php simplexmlElement操作xml的命名空间实现代码
摘要:看了这个问题,第一个反应就是namespace的关系,但我从来没有使用simplexml操作过namespace,于是就翻开手册查了一下资料...

看了这个问题,第一个反应就是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 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>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

【php simplexmlElement操作xml的命名空间实现代码】相关文章:

php使用cookie实现记住登录状态

php实现的mongodb操作类实例

Classes and Objects in PHP5-面向对象编程 [1]

PHP中的加密功能

php中memcache 基本操作实例

第十四节 命名空间 [14]

递归实现php数组转xml的代码分享

PHP+shell实现多线程的方法

操作Oracle的php类

Mac环境下php操作mysql数据库的方法分享

精品推荐
分类导航