【问题标题】:PHP Fatal error: String could not be parsed as XMLPHP 致命错误:无法将字符串解析为 XML
【发布时间】:2011-11-27 17:27:10
【问题描述】:

我正在尝试在我的网站上包含一个 RSS 提要。以下代码可以在本地运行,但会在实时站点上导致致命错误:

<?php
// Initialise the cURL resource handle:
$ch = curl_init("http://www.blogs.stopjunkmail.org.uk/diary/index.php?/feeds/index.rss2");
// Set connection options:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
// Execute connection, wait for response, and close:
$data = curl_exec($ch);
curl_close($ch);
// Parse the data:
$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);
// Define the function to parse RSS:
function parseRSS($doc) {
    echo '<ul>' . "\n";
    for($i=0; $i<5; $i++) {
        $url    = $doc->channel->item[$i]->link;
        $title  = $doc->channel->item[$i]->title;
        $date   = $doc->channel->item[$i]->pubDate;
        echo '<li>' . "\n";
        echo '<a href="'.$url.'">'.$title.'</a>' . "\n";
        echo '</li>' . "\n";
    }
    echo '</ul>' . "\n";
}
?>
<!doctype html>
<html lang="en-GB">
<head>
 <meta charset="UTF-8" />
 <title>Test feed</title>
</head>
<body>

 <h2>Recent blog entries</h2>
<?php parseRSS($doc); ?>

</body>
</html>

这会导致以下错误:

[Thu Sep 29 12:06:28 2011] [error] [client xx.xx.xx.xxx] PHP Fatal error:  Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /home/sites/stopjunkmail.org.uk/public_html/news/_test.php:11
[Thu Sep 29 12:06:28 2011] [error] [client xx.xx.xx.xxx] Stack trace:
[Thu Sep 29 12:06:28 2011] [error] [client xx.xx.xx.xxx] #0 /home/sites/stopjunkmail.org.uk/public_html/news/_test.php(11): SimpleXMLElement->__construct('', 16384)
[Thu Sep 29 12:06:28 2011] [error] [client xx.xx.xx.xxx] #1 {main}
[Thu Sep 29 12:06:28 2011] [error] [client xx.xx.xx.xxx]   thrown in /home/sites/stopjunkmail.org.uk/public_html/news/_test.php on line 11

经过大量试验和错误并查找类似问题后,我发现是导致问题的提要。如果我将提要更改为非常基本的样本感觉(例如http://feedparser.org/docs/examples/rss20.xml),一切正常。我尝试解析的提要有效(尽管有一些警告)。

问题是...我需要做什么才能让脚本接受提要?

【问题讨论】:

  • 你对feed有影响吗?你可以让它有效;)

标签: php xml curl rss


【解决方案1】:

也许是另一种强制 MIME 类型的选项?

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: text/xml'));

编辑:与本地环境相比,您的网络服务器上的 cURL 也可能存在问题。如果 PHP 版本不同,那么这可能是个问题。

【讨论】:

  • 没有成功 :(。PHP 版本不同:本地 5.3.2 与 5.2.17 实时。我已将本地 PHP 设置为 5.2.13 - 提要仍在显示.
【解决方案2】:

使用 mb_convert_encoding() 更改为 utf8 并且不要忘记调用 parseRSS() 函数。

// Initialise the cURL resource handle:
$ch = curl_init("http://www.blogs.stopjunkmail.org.uk/diary/index.php?/feeds/index.rss2");
// Set connection options:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
// Execute connection, wait for response, and close:
$data = curl_exec($ch);
curl_close($ch);
// Parse the data:
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, 'UTF-8', $enc);

// Define the function to parse RSS:
function parseRSS($doc) {
    echo '<ul>' . "\n";
    for($i=0; $i<5; $i++) {
        $url    = $doc->channel->item[$i]->link;
        $title  = $doc->channel->item[$i]->title;
        $date   = $doc->channel->item[$i]->pubDate;
        echo '<li>' . "\n";
        echo '<a href="'.$url.'">'.$title.'</a>' . "\n";
        echo '</li>' . "\n";
    }
    echo '</ul>' . "\n";
}
parseRSS($doc);
?>
<!doctype html>
<html lang="en-GB">
<head>
 <meta charset="UTF-8" />
 <title>Test feed</title>
</head>
<body>

【讨论】:

  • 既然 PHP 已经有了更好的集成函数,为什么还要创建自定义函数?我也看不出这是一个编码问题?
  • 这个答案救了我。
猜你喜欢
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
相关资源
最近更新 更多