使用PHP解析XML时,它只显示文件中的第一条记录,而不是所有记录

时间:2011-08-03 20:41:32

标签: php xml xml-parsing

以下是我的代码:

foreach(simplexml_load_file('http://www.bbc.co.uk/radio1/playlist.xml')->item as $link){
$linked = $link->artist; 
$xml_data = file_get_contents('http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=' . $linked . '&api_key=b25b959554ed76058ac220b7b2e0a026');
$xml = new SimpleXMLElement($xml_data);
foreach($xml->images as $test){
$new = $test->image->sizes->size[4];

echo "<img src='$new'>";

?><br /><?php
}}

?>

这确实有效,但它只显示许多记录中的一条记录,它显示了XML文件中的第一条记录。我希望它显示所有记录。

我想从这段代码中实现的目标是:

我有一个xml文件我从中获取艺术家名称,然后列出所有艺术家名称并将它们插入到链接中,因此链接是从它们生成的艺术家名称动态创建的。然后,我想要获取动态创建的链接,这是另一个xml文件,并解析该文件以获取作为图像链接的大小节点(图像是艺术家的图像)。然后,我希望将该图像链接回显到显示图像的图像标记。

它部分有效,但正如我之前所说,它只显示一条记录而不是xml文件中的所有记录。

2 个答案:

答案 0 :(得分:2)

问题:

  1. 限速。我对这个问题的评论:

      

    请注意每次执行此脚本时会产生多少网络流量,并相应地进行缓存。如果你在一天中执行得太频繁或太多次,那么你很可能会受到速率限制(而且API速率限制通常比人们想象的要低很多)。

    即使您只是“测试”,或者您和“其他几个人”使用此功能,每个请求都会向ws.audioscrobbler.com 发出 40个自动请求!他们对此不会感到高兴,因为看起来他们很聪明,他们已经禁止这种交通。

    当我运行此脚本时, ws.audioscrobbler.com 会提供第一个结果(艺术家:阿黛尔),但会在许多后续请求中发出请求失败警告,直到某段时间过去,显然由于速率限制。

    <强>疗法

    1. 检查ws.audioscrobbler.com的API是否具有多个艺术家查询。这样您就可以通过一个请求获得多位艺术家。

    2. 创建一个管理员界面,可以一次获得一位艺术家的AND CACHE结果。然后,在需要更新时执行此过程,并在其他时间使用缓存的结果。

    3. 无论您使用哪种方法,缓存,缓存,缓存!

    4. 提供给内部foreach的错误参数file_get_contents返回一个字符串。即使内容是XML,您也没有将其加载到XML解析器中。在迭代它之前,你需要这样做。

答案 1 :(得分:2)

返回的XML结构如下:

<lfm>
    <images>
        <image>
        <image>
        …
        <image>

这意味着你必须迭代

$xml->images->image

示例:

$lfm = simplexml_load_file('http://…');
foreach ($lfm->images->image as $image) {
    echo $image->sizes->size[4];
}

在旁注中,没有理由在那里使用file_get_contents。使用simplexml_load_file或使用new SimpleXmlElement('http://…', false, true)。并且真的没有冒犯,但鉴于我已经在When extracting artist name from XML file only 1 record shows的评论中给了你一个几乎相同的解决方案,我强烈建议你试着去理解那里发生的事情而不仅仅是复制和粘贴。