2012-03-12 16 views
5

Accedo a gData Api su YouTube. Userò this xml come riferimento.SimpleXMLElement, xpath e elementi secondari

Sto usando xpath su un oggetto SimpleXMLElement figlio, ma piuttosto che xpath cerca SOLO l'elemento figlio e i suoi figli, sembra che stia ancora cercando dalla radice in basso.

ho il seguente codice:

<?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")); 
} 

Piuttosto che il previsto:

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" 
    } 
} 

ottengo:

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" 
... 

Quindi, anche se sono il lavoro su un bambino elemento dell'elemento root, perché xpath cerca ancora l'elemento padre? E ancora più importante, come posso cercare solo l'elemento figlio?

risposta

5

È necessario rimuovere // dall'espressione durante il backup e quindi applicare l'espressione all'intero documento. Quello che stai cercando è una singola barra /, che inizia dalla radice del frammento del documento specificato.

Questo dovrebbe fare il trucco. :)

modifica: omettendo completamente la barra dovrebbe fare anche il trucco.

+1

Solo "omettere completamente la barra dovrebbe fare anche il trucco". ha funzionato nel mio caso. – MingalevME

Problemi correlati