2014-01-25 84 views
0

我試圖從YouTube XML源獲取視頻信息,例如標題和縮略圖URL。訪問名稱中含有冒號的XML屬性PHP

讓我們這個飼料爲例: http://gdata.youtube.com/feeds/api/videos/CevxZvSJLk8

下面的代碼我現在有:

$videoURL = 'http://gdata.youtube.com/feeds/api/videos/CevxZvSJLk8'; 
$sxml = simplexml_load_file($videoURL); 
print_r($sxml); 

然而,這似乎並沒有被包括媒體:該XML的組部分片。

本質上講,我試圖讓這兩個值:

entry -> media:group -> media:title 
entry -> media:group -> media:thumbnail 

編輯:這是我最後從閱讀其他類似的問題,與去解決。

$videoTitle = $sxml->children('media', true)->group->title; 
$videoThumbnail = $sxml->children('media', true)->group->thumbnail->attributes()->url; 
+1

1)不使用'的print_r()','的var_dump()'等用SimpleXML;他們會騙你。 2)在StackOverflow中搜索「simplexml冒號」,「simplexml命名空間」等;這個問題已經被問了大約一百萬次了。 – IMSoP

+0

好吧,其他答案幫我弄明白了。謝謝。 – zen

回答

0

標記名稱中的冒號將命名空間前綴與本地元素或屬性名稱分開。問題中的提要有幾個名稱空間。

  • http://www.w3.org/2005/Atom
  • http://purl.org/atom/app#前綴app
  • http://search.yahoo.com/mrss/前綴media
  • http://schemas.google.com/g/2005前綴gd
  • http://gdata.youtube.com/schemas/2007前綴yt

Ť他的名稱空間前綴是實際名稱空間的別名,它只對文檔有效,並且可以針對子節點進行更改。下一個Feed可以使用前綴​​作爲http://www.w3.org/2005/Atom。所以根據文檔中的命名空間前綴是一個壞主意。

如果您使用Xpath從文檔中獲取元素,則可以爲使用的名稱空間註冊自己的前綴。以下示例直接以字符串形式提取媒體RSS標題和大縮略圖的網址。如果一個元素不存在,它將返回一個空字符串。

$videoURL = 'http://gdata.youtube.com/feeds/api/videos/CevxZvSJLk8'; 
$dom = new DOMDocument(); 
$dom->load($videoURL); 

$xpath = new DOMXPath($dom); 
$xpath->registerNamespace('mrss', 'http://search.yahoo.com/mrss/'); 

var_dump(
    $xpath->evaluate('string(//mrss:title)', NULL, FALSE), 
    $xpath->evaluate('string(//mrss:thumbnail[@width="480"]/@url)', NULL, FALSE) 
); 

輸出:

string(28) "Katy Perry - Roar (Official)" 
string(40) "http://i1.ytimg.com/vi/CevxZvSJLk8/0.jpg" 
+0

不錯的介紹,但是提出的解決方案引入了OP以前未使用的兩種技術(DOM和XPath),而不是僅僅使用SimpleXML本身的命名空間函數(' - > children($ ns)'和' - > attributes $ NS)')。 – IMSoP

+0

Yep @IMSoP是正確的。這是我最終做的:'$ sxml-> children('media',true) - > group-> title;'爲標題和$ sxml-> children('media',true) - > group-> thumbnail-> attributes() - > url;'獲取url。 – zen

+0

SimpleXML變體不太穩定,XML命名空間前綴和缺失元素(外部資源)中的有效更改可能導致PHP錯誤。 – ThW

相關問題