Неустранимая ошибка PHP: строка не может быть проанализирована как XML - PullRequest
1 голос
/ 29 сентября 2011

Я пытаюсь включить 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), все это работает нормально. Канал, который я пытаюсь проанализировать, действителен (хотя и содержит некоторые предупреждения).

Вопрос... что мне нужно сделать, чтобы скрипт принял канал?

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Измените на utf8 с помощью mb_convert_encoding () и не забудьте вызвать функцию 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>
0 голосов
/ 29 сентября 2011

Может быть, другой вариант для принудительного ввода MIME-типа?

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

РЕДАКТИРОВАТЬ: Может также быть проблема с cURL на вашем веб-сервере по сравнению с вашей локальной средой. Если версии PHP отличаются, это может быть проблемой.

...