2012-03-12 68 views
5

我访问YouTube上的GDATA API。我将使用this xml作为参考。的SimpleXMLElement,XPath和子元素

我使用的是孩子的SimpleXMLElement对象的XPath,而是比的XPath仅搜索子元素和它的孩子,似乎仍然可以从根向下搜索。

我有以下代码:

<?php 

date_default_timezone_set('Australia/Sydney'); 
$url = "http://gdata.youtube.com/feeds/api/playlists/58FD3A7244B64B99?prettyprint=true&alt=atom&v2=1&fields=title,subtitle,logo,entry%28link%[email protected]=%27alternate%27%5D,id,title,content,author,yt:statistics%29"; 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
$rawResponse = curl_exec($curl); 

$xmlData = simplexml_load_string($rawResponse); 
$xmlData->registerXPathNamespace('yt', 'http://gdata.youtube.com/schemas/2007'); 

foreach($xmlData->entry as $entry) { 
    var_dump($entry->asXml()); 
    myFunction($entry); die(); 
} 

function myFunction(SimpleXMLElement $xml) 
{ 
    var_dump($xml->xpath("//yt:statistics")); 
} 

比相反的预期:

string(666) "<entry> 
       <id>http://gdata.youtube.com/feeds/api/playlists/58FD3A7244B64B99/PLlwIr0olq0UxVV_ouqclCE0xRZvs2Lytl</id> 
       <title type="text">Zero Punctuation on The Escapist</title> 
       <content type="text">Zero Punctuation picks apart the games so you don't have to. View new episodes every Wednesday only 
at http://www.escapistmagazine.com</content> 
       <link rel="alternate" type="text/html" href="http://www.youtube.com/watch?v=7EpzwuZOvKY&amp;feature=youtube_gdata"/> 
       <author> 
         <name>theescapistmagazine</name> 
         <uri>http://gdata.youtube.com/feeds/api/users/theescapistmagazine</uri> 
       </author> 
       <yt:statistics favoriteCount="256" viewCount="188598"/> 
     </entry>" 
object(SimpleXMLElement)#5 (1) { 
    ["@attributes"]=> 
    array(2) { 
    ["favoriteCount"]=> 
    string(3) "256" 
    ["viewCount"]=> 
    string(6) "188598" 
    } 
} 

我得到:

string(666) "<entry> 
       <id>http://gdata.youtube.com/feeds/api/playlists/58FD3A7244B64B99/PLlwIr0olq0UxVV_ouqclCE0xRZvs2Lytl</id> 
       <title type="text">Zero Punctuation on The Escapist</title> 
       <content type="text">Zero Punctuation picks apart the games so you don't have to. View new episodes every Wednesday only 
at http://www.escapistmagazine.com</content> 
       <link rel="alternate" type="text/html" href="http://www.youtube.com/watch?v=7EpzwuZOvKY&amp;feature=youtube_gdata"/> 
       <author> 
         <name>theescapistmagazine</name> 
         <uri>http://gdata.youtube.com/feeds/api/users/theescapistmagazine</uri> 
       </author> 
       <yt:statistics favoriteCount="256" viewCount="188598"/> 
     </entry>" 
array(25) { 
    [0]=> 
    object(SimpleXMLElement)#5 (1) { 
    ["@attributes"]=> 
    array(2) { 
     ["favoriteCount"]=> 
     string(3) "256" 
     ["viewCount"]=> 
     string(6) "188598" 
    } 
    } 
    [1]=> 
    object(SimpleXMLElement)#6 (1) { 
    ["@attributes"]=> 
    array(2) { 
     ["favoriteCount"]=> 
     string(4) "4787" 
     ["viewCount"]=> 
     string(7) "1276435" 
    } 
    } 
    [2]=> 
    object(SimpleXMLElement)#7 (1) { 
    ["@attributes"]=> 
    array(2) { 
     ["favoriteCount"]=> 
     string(4) "7628" 
     ["viewCount"]=> 
     string(7) "1702845" 
... 

所以,即使我对孩子的工作元素的根元素,为什么xpath仍然在搜索父元素?更重要的是,我如何才能搜索子元素?

回答

5

你必须从你的表现中删除//,因为它备份,然后应用体现出了整个文档。什么你要找的是一个单一的斜线/,从给定的文档片段的根开始。

这应该做的伎俩。 :)

编辑:完全省略斜线应该做的伎俩也。

+1

只是“完全省略斜线应该做的伎俩也。”在我的情况下工作。 – MingalevME 2015-12-03 13:03:37