2012-03-12 12 views
5

Uzyskuję dostęp do gData Api na YouTube. Będę używał this xml w celach informacyjnych.Elementy SimpleXMLElement, xpath i sub

Używam xpath na podrzędnym obiekcie SimpleXMLElement, ale zamiast wyszukiwania przez xpath TYLKO elementu podrzędnego i jego elementów potomnych, nadal wydaje się, że przeszukuje obiekt od dołu.

Mam następujący kod:

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

Zamiast oczekiwana:

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

uzyskać:

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

Tak, chociaż jestem prace nad dzieckiem element elementu głównego, dlaczego xpath wciąż szuka elementu nadrzędnego? A co ważniejsze, jak mogę wyszukać tylko element potomny?

Odpowiedz

5

Musisz usunąć // z wyrażenia podczas tworzenia kopii zapasowej, a następnie zastosować wyrażenie do całego dokumentu. To, czego szukasz, to pojedynczy ukośnik /, który zaczyna się od katalogu głównego danego fragmentu dokumentu.

To powinno załatwić sprawę. :)

edytuj: całkowicie pomijając ukośnik również powinien wystarczyć.

+1

Po prostu "całkowite pominięcie ukośnika również powinno wystarczyć". działa w moim przypadku. – MingalevME

Powiązane problemy