【问题标题】:create xml from mysql data using php使用 php 从 mysql 数据创建 xml
【发布时间】:2026-01-03 20:55:01
【问题描述】:

我有这个代码:

<?php
header('Content-type: text/xml');

$xmlout = "<?xml version=\"1.0\" ?>\n";
$xmlout .= "<persons>\n";

$db = new PDO('mysql:host=localhost;dbname=xxx','root','');
$stmt = $db->prepare("select * from users");
$stmt->execute();
while($row = $stmt->fetch()){
    $xmlout .= "\t<person>\n";
    $xmlout .= "\t\t<id>".$row['id']."</id>\n";
    $xmlout .= "\t\t<username>".$row['username']."</username>\n";
    $xmlout .= "\t\t<password>".$row['password']."</password>\n";
    $xmlout .= "\t\t<realname>".$row['realname']."</realname>\n";
    $xmlout .= "\t\t<surname>".$row['surname']."</surname>\n";
    $xmlout .= "\t\t<email>".$row['email']."</email>\n";
    $xmlout .= "\t\t<created>".$row['created']."</created>\n";
    $xmlout .= "\t\t<admin>".$row['admin']."</admin>\n";
    $xmlout .= "\t</person>\n";
}

$xmlout .= "</persons>";
echo $xmlout;
?>

它不起作用,它有这个错误:

第 2 行第 1 列的错误:文档末尾的额外内容 下面是出现第一个错误之前的页面渲染。

有谁知道问题出在哪里?

【问题讨论】:

  • 删除?&gt; 或在echo 之后添加exit;
  • 你不应该手动创建 XML,你应该使用类似SimpleXML
  • 我删除 ?> 或退出,它没有帮助......我手动执行此操作,因为我是 xml 的初学者,这种方式在我看来是最简单的方式
  • 实际上,XMLWriter 正是用于此类工作的 API。 SimpleXML 更适合读取简单、小型的 XML 结构。

标签: php mysql xml


【解决方案1】:

\t(标签)有什么用?您在代码中手动声明它是否有特定原因?你试过删除它吗?

另外,在设置标头之前尝试构建 XML 字符串,然后回显该字符串。

【讨论】:

  • 是的,我试过删除,但这没问题
【解决方案2】:

考虑使用DOMDocument 类而不是字符串连接来构建XML。特殊空格和制表符可能与标题输出冲突。 DOM 将使用其formatOutput 方法漂亮地打印输出。

header('Content-type: text/xml');

// INITIALIZE DOM OBJECT
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;            
$dom->preserveWhiteSpace = false;

// CREATE ROOT AND APPEND TO DOCUMENT
$xmlRoot = $dom->createElement("persons");
$xmlRoot = $dom->appendChild($xmlRoot);

// QUERY DATABASE
$db = new PDO('mysql:host=localhost;dbname=xxx','root','');
$stmt = $db->prepare("select * from users");
$stmt->execute();

// FETCH ROWS ITERATIVELY
while($row = $stmt->fetch()){
     // APPEND PERSON AS CHILD OF ROOT
     $personNode = $xmlRoot->appendChild($dom->createElement('person'));
     // APPEND CHILDREN TO PERSON         
     $personNode->appendChild($dom->createElement('id', $row['id']));
     $personNode->appendChild($dom->createElement('username', $row['username']));
     $personNode->appendChild($dom->createElement('password', $row['password']));
     $personNode->appendChild($dom->createElement('realname', $row['realname']));
     $personNode->appendChild($dom->createElement('surname', $row['surname']));
     $personNode->appendChild($dom->createElement('email', $row['email']));
     $personNode->appendChild($dom->createElement('created', $row['created']));
     $personNode->appendChild($dom->createElement('admin', $row['admin']));
}
$stmt = null; 
$db = null;

// OUTPUT TO SCREEN
echo $dom->saveXML();

【讨论】: