2013-06-19 144 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