2011-06-09 44 views
2
下面

是飼料我設法使用此XPath
$xml->xpath('/rss/channel//item')說要把我逼瘋了簡單的XPath問題

結構打印內容

<rss><channel><item><pubDate></pubDate><title></title><description></description><link></link><author></author></item></channel></rss> 

但是我的一些文件都遵循這種結構的結構

<feed xmlns="http://www.w3.org/2005/Atom" .....><entry><published></published><title></title><description></description><link></link><author></author></entry></feed> 

我猜想這應該是xpath得到條目的內容

$xml->xpath('/feed//entry') 

事情證明我錯了。

我的問題是什麼是正確的xpath使用?我是否缺少別的東西?

這是代碼

<?php 

$feeds = array('http://feeds.feedburner.com/blogspot/wSuKU'); 


$entries = array(); 
foreach ($feeds as $feed) { 
    $xml = simplexml_load_file($feed); 
    $entries = array_merge($entries, $xml->xpath('/feed//entry')); 
} 

echo "<pre>"; print_r($entries); echo"</pre>"; 

?> 
+0

/feed //輸入正常(/ feed/entry應該也可以)。你究竟得到了什麼?什麼不行? – unbeli 2011-06-09 21:03:06

+0

'//'不是必須的(它可以只是'/'),但是這個查詢似乎對我有效...... – lonesomeday 2011-06-09 21:03:12

+1

是否存在您已經不在示例中的名稱空間? – 2011-06-09 21:04:08

回答

4

試試這個:

$xml->registerXPathNamespace('f', 'http://www.w3.org/2005/Atom'); 
$xml->xpath('/f:feed/f:entry'); 
+0

工作!謝謝你的時間!我可以再問一件事嗎?想象一下,我在數組中使用了兩個提要,每個提供一個結構。有沒有辦法將xPath結合起來,這樣它就可以在兩個Feed上工作了?就像如果你沒有在/ rss/channel // item中找到任何結果,使用你發佈的代碼。我希望自己可以理解... – EnexoOnoma 2011-06-09 21:18:11

+0

另一方面,是否有一種服務可以爲我添加的任何飼料生成相同的結構? (我想這是一個工作) – EnexoOnoma 2011-06-09 21:19:43

+0

好吧,嘗試一個xpath,如果它什麼都不返回,請嘗試其他。 – unbeli 2011-06-09 21:26:36

2

如果你想要一個XPath表達式時,應用到任何一個RSS或ATOM供稿,將工作,你可以使用以下任一XPath表達式:

這一個是最精確的,同時也是最詳細:

(/rss/channel/item 
    | /*[local-name()='feed' and namespace-uri()='http://www.w3.org/2005/Atom'] 
     /*[local-name()='entry' and namespace-uri()='http://www.w3.org/2005/Atom']) 

這其中忽略了ATOM元素的名稱空間,只是符合他們local-name()

(/rss/channel/item | /*[local-name()='feed']/*[local-name()='entry']) 

這一個是最簡單的,但也是最精確,效率最低:

/*//*[local-name()='item' or local-name()='entry']