【问题标题】:When parsing XML with PHP, it only shows the first record from the file, not all of them用 PHP 解析 XML 时,它只显示文件中的第一条记录,而不是全部
【发布时间】:2011-10-19 11:13:50
【问题描述】:

下面是我的代码:

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 文件中的所有记录。

【问题讨论】:

  • 请注意您在每次执行此脚本时产生了多少网络流量,并相应地进行缓存。如果您一天执行的次数过多或次数过多,您很可能会受到速率限制(而且 API 速率限制通常比人们想象的要低很多)。
  • $links 不是已经是 xml 元素了吗?您不需要每次都从中创建新的 xml 文档。只需输入 $links-&gt;images-&gt;image-&gt;sizes-&gt;size 即可。
  • 它只用于测试,所以不会产生太多流量,应该只有我和其他几个人

标签: php xml xml-parsing


【解决方案1】:

问题:

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

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

    即使您只是“测试”,或者您和“少数其他人”使用它,每个请求都会向 ws.audioscrobbler.com 发出 40 个自动请求!他们不会对此感到高兴,而且由于看起来他们很聪明,他们已经禁止了这种流量。

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

    补救措施:

    1. 检查 ws.audioscrobbler.com 的 API 是否具有多艺术家查询。这将允许您通过一个请求获得多个艺术家。

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

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

  2. 提供给内部 foreach 的参数错误file_get_contents 返回一个字符串。即使内容是 XML,您也没有将其加载到 XML 解析器中。您需要先执行此操作,然后才能对其进行迭代。

【讨论】:

    【解决方案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)。真的没有冒犯,但鉴于我已经在 cmets 中为您提供了与 When extracting artist name from XML file only 1 record shows 几乎相同的解决方案,我强烈建议您尝试了解那里发生的事情,而不仅仅是复制和粘贴。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 2015-01-01
      相关资源
      最近更新 更多