从MySQL表创建xml rss feed时出错

时间:2014-12-28 17:07:39

标签: php mysql xml rss

当我从localhost上的MySQL数据库创建XML RSS Feed时出现以下错误:

Extra content at the end of the document

这是我的代码:

     <?php
// PDO connect *********
function connect() {
    return new PDO('mysql:host=localhost;dbname=lookout', 'admin', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}

$pdo = connect();

// posts *******************************
$sql = 'SELECT * FROM `event` ORDER BY serial DESC';
$query = $pdo->prepare($sql);
$query->execute();
$rs_post = $query->fetchAll();

// The XML structure

$data .= '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">';
$data .= '<channel>';

foreach ($rs_post as $row) {
    $data .= '<item>';
    $data .= '<time>'.$row['timestamp'].'</time>';
    $data .= '<date>'.$row['timestamp'].'</date>';
    $data .= '<location>'.$row['longitude'].'</location>';
    $data .= '<report>'.$row['details'].'</report>';
    $data .= '</item>';
}
$data .= '</channel>';
$data .= '</rss> ';

header('Content-Type: application/xml');
echo $data;
?>

没有根标签丢失,一切似乎都是有序但显然不是。

2 个答案:

答案 0 :(得分:1)

  

根据@ fejese的评论,这可能是由于您的数据库中未转义的内容。而不是手动使用字符串构建文档,为什么不使用像DomDocument这样的已建立的库来以安全的方式创建元素?

以下是使用DOMDocument构建RSS Xml Feed的示例,而不是通过字符串连接手动执行此操作。这样,数据库中可能存在的无效字符序列的所有繁重工作都由库完成:

$xml = new DOMDocument('1.0', 'utf-8');
$element = $xml->createElement('rss');

$rss = $xml->appendChild($xml->createElement("rss"));
$rss->setAttribute("version","2.0");
$rss->setAttribute("xmlns:atom","http://www.w3.org/2005/Atom");
$channel = $xml->createElement("channel");
foreach ($rs_post as $row) {
    $item = $xml->createElement("item");
    $item->appendChild($xml->createElement("time", $row['timestamp']));
    $item->appendChild($xml->createElement("date", $row['timestamp']));
    $item->appendChild($xml->createElement("location", $row['longitude']));
    $item->appendChild($xml->createElement("report", $row['details']));
    $channel->appendChild($item);
}
$rss->appendChild($channel);

header('Content-Type: application/xml');
echo $xml->saveXML();

答案 1 :(得分:0)

这是导致问题的$ data附加。

首次使用$data = "";之前$data删除了错误。

进入显示错误的xml文档的源代码会产生更好更详细的错误,并说出Variable doesn't exist: data的内容。

修改

斯图尔特在另一个答案中所说的也可能导致同样的问题,他提出了另一种使用DOM库创建XML RSS提要的有趣观点。