這是今天中午發(fā)生的事情,,有人在群里求助,比如xml中如果標(biāo)記是<xx:xxxx>content</xx:xxxx>這樣的情況下,,取不到 xx:xxxx 為下標(biāo)的值,。 看了這個問題,第一個反應(yīng)就是namespace的關(guān)系,,但我從來沒有使用simplexml操作過namespace,,于是就翻開手冊查了一下資料,問題并沒有解決,,最終是通過google解決了該問題,。
提問題的朋友貼出了數(shù)據(jù)源,來自于:http://code.google.com/intl/zh-CN/apis/contacts/docs/3.0/developers_guide_protocol.html#retrieving_without_query,,數(shù)據(jù)結(jié)構(gòu)大致如下:
XML/HTML代碼
- <feed xmlns='http://www./2005/Atom' xmlns:openSearch='http:///-/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>[email protected]</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' />
- <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' />
- <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' />
- <link rel='self' type='application/atom+xml' />
- <author>
- <name>Elizabeth Bennet</name>
- <email>[email protected]</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./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/*' />
- <link rel='self' type='application/atom+xml' />
- <link rel='edit' type='application/atom+xml' />
- <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' />
- </entry>
- </feed>
這個結(jié)構(gòu)在上面的地址里有,,這個是我格式化過的XML數(shù)據(jù),現(xiàn)在要取得類似于“<gd:phoneNumber rel='http://schemas.google.com/g/2005#home' primary='true'> 456 </gd:phoneNumber> ”中的值,。
最終代碼如下:
PHP代碼
- $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;
- }
當(dāng)然,,如果不象上面這樣寫,也可以寫成這樣:
PHP代碼
- $x = new SimpleXmlElement($str);
- foreach($x->entry as $t){
- echo $t->id . "<br >";
- echo $t->updated . "<br />";
- //$namespaces = $t->getNameSpaces(true);
- //注意這里與上面一段的區(qū)別
- $gd = $t->children('http://schemas.google.com/g/2005');
- echo $gd->phoneNumber;
- }
只是象第二種寫法就屬于硬編碼了,,這樣不太好,,萬一哪天有變化,還得再更改N多代碼,。 問題接踵而來,,比如象下面這段:
XML/HTML代碼
- <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>
這種非標(biāo)準(zhǔn)的XML,沒有定義命名空間,,怎么辦,?在這種情況下,其實SimpleXmlElement就已經(jīng)直接可以解決了,,但是會報warnging,因為他認(rèn)為event這個命名空間不存在,。 解決方法是:
PHP代碼
- $xml = @new SimpleXmlElement($str);//在前面加@抑止錯誤。
- echo "<pre>";
- print_r($xml);
目前看來,,這種解決方法比較好,。
轉(zhuǎn)發(fā)到朋友圈:
|