以下是我的代码:
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文件中的所有记录。
答案 0 :(得分:2)
问题:
限速。我对这个问题的评论:
请注意每次执行此脚本时会产生多少网络流量,并相应地进行缓存。如果你在一天中执行得太频繁或太多次,那么你很可能会受到速率限制(而且API速率限制通常比人们想象的要低很多)。
即使您只是“测试”,或者您和“其他几个人”使用此功能,每个请求都会向ws.audioscrobbler.com 发出 40个自动请求!他们对此不会感到高兴,因为看起来他们很聪明,他们已经禁止这种交通。
当我运行此脚本时, ws.audioscrobbler.com 会提供第一个结果(艺术家:阿黛尔),但会在许多后续请求中发出请求失败警告,直到某段时间过去,显然由于速率限制。
<强>疗法强>
检查ws.audioscrobbler.com的API是否具有多个艺术家查询。这样您就可以通过一个请求获得多位艺术家。
创建一个管理员界面,可以一次获得一位艺术家的AND CACHE结果。然后,在需要更新时执行此过程,并在其他时间使用缓存的结果。
无论您使用哪种方法,缓存,缓存,缓存!
提供给内部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的评论中给了你一个几乎相同的解决方案,我强烈建议你试着去理解那里发生的事情而不仅仅是复制和粘贴。