2013-06-19 197 views
0

我從XML提要讀取數據如下:PHP RSS閱讀器效率

$data=file_get_contents("mydata.rss"); 

$data=simplexml_load_string($data); 

foreach($data->channel->item as $item){ 

    $articles[] = array(
        'description' => (string)$item->description, 
        'link' => (string)$item->link, 
        'pubDate' => (string)$item->pubDate,); 

} 

的問題是,飼料是非常長,也許100個項目。我只想讀第一個10.我可以通過手動設置一個計數器然後在foreach循環中使用if語句來解決這個問題,但是我不認爲這是最好的方法,因爲整個feed仍然被讀取,因此不必要額外開銷。

什麼是實現這一目標,而不必讀取整個飼料的最有效的方法是什麼?

在此先感謝...

+0

如果您不讀取/解析整個飼料,它將是無效的xml,並導致simplexml失敗。除此之外,您可以將foreach更改爲for循環,但計數器之間的差異很小。也許在哪裏你得到的飼料接受一個參數來限制條目的數量。 –

+0

您可以添加maxlen,但您必須猜測該值,然後使用破損的xml Feed。也許你正在檢索飼料經常?你是否可以每天做(笨蛋)並將其存儲在本地? – 2013-06-19 22:25:30

+0

你可以使用舊的基於expat的xml解析器給你一個事件驅動的訪問xml - http://www.php.net/manual/en/book.xml.php – Orangepill

回答

0

使用SimpleXML,就像你說的,你加載所有文件在內存中,那麼它的解析。然後你迭代內存中的加載元素。

使用SAX般的解析器一樣"XML Parser",將讓你不讀完整的文件。我不知道如何實現,但SAX中的每個事件都會在每次檢測到新元素時觸發事件。然後,您可以開始閱讀RSS,並在「item」類型的第10個元素關閉時停止解析。

此形式給出了更小的內存佔用和更快。另一方面,對XML的元素進行迭代並不容易。

+0

感謝回覆的傢伙,它似乎我應限制飼料而不是限制從飼料中讀取的內容。食物的思想... – user2056238