抛出异常String无法解析为XML

时间:2014-06-30 18:09:05

标签: php xml string exception simplexml

我正在使用此代码

<?php 
    $feedUrl = 'http://www.infoextractor.org/upfiles/songlinks.txt.xml';
    $rawFeed = file_get_contents($feedUrl);
    $viewfile = new SimpleXmlElement($rawFeed);

    foreach ($viewfile->channel->item as $viewfileinfo):
        $title=$viewfileinfo->title;

        echo " <span>",$title,"</span> ";

    endforeach;
?>

从以下链接中获取所有标题 - http://www.infoextractor.org/upfiles/songlinks.txt.xml

它上周正在运行,但现在它出现了&#34; Exception thrown String无法解析为XML&#34;。

上周减少了8个条目并且它正在运行,我已经删除它们以查看是否存在问题,但它仍然引发异常,可能xml文件中的某些内容生成的方式不同?

2 个答案:

答案 0 :(得分:0)

该异常会告诉您确切的错误:Feed网址有时会返回格式错误的XML。这可能是由于Feed中用户生成的内容有时具有非法的XML字符,例如&<。该XML Feed的所有者应该转义所有用户生成的内容。

您可以尝试解析内容并“修复”它,但如果没有SimpleXml,这将是一种痛苦。一个更简单的解决方案是等待一段时间,直到用户生成的带有违规字符的内容从Feed中循环出来。

请注意,与HTML解析器不同,符合标准的XML解析器必需抛出异常并停止解析无效输入。

答案 1 :(得分:0)

您的代码缺少正确的错误处理:

$rawFeed = file_get_contents($feedUrl);

这里有不同类型的错误,你没有处理:

  • file_get_contents失败并返回FALSE。你必须检查一下,例如

    if ($rawFeed === FALSE) {
        throw new RuntimeException(
            'Deal with it: Unable to retrieve %s',
             $feedUrl
        );
    }
    
  • file_get_contents返回非(有效)XML的内容。那就是你需要捕获创建 SimpleXmlElement 的例外:

    try {
        $viewfile = new SimpleXmlElement($rawFeed);
    } catch (Exception $e) {
        throw new RuntimeException('Deal with it: ' . $e->getMessage(), 0, $e);
    }
    

在任何情况下,您都需要自己进行错误处理。你不能指望一切都在神奇地运作。实际情况恰恰相反,设计失败。特别是在处理远程资源时。