XML报错:文档末尾存在额外内容,PHP生成XML代码求助
解决XML输出“文档末尾存在额外内容”错误
问题场景
PHP代码实现CSV转XML功能,生成的XML格式看似正确,但运行时提示错误:第2行第1列:文档末尾存在额外内容(Extra content at end of document)。原代码如下:
<?php $csv = array_map(function($v){return str_getcsv($v, "|");},file('quotes.csv')); $hdrs = array_shift($csv); $count = 0; $xml = '<?xml version="1.0" encoding="UTF-8"?>'; $xml .= '<quotes>'; foreach($csv as $k=>$v) { $xml .= '<record id="' . ++$count .'">'; foreach($hdrs as $h=>$i) { $xml .= '<' . $i . '>' . htmlspecialchars($v[$h], ENT_XML1, 'UTF-8') . '</' . $i . '>'; } $xml .= '</record>'; } $xml .= '</quotes>'; header ("Content-Type:text/xml"); echo $xml; ?>
预期输出XML格式:
<quotes> <record id="1"> <quote>There is no remedy but to love more.</quote> <source>Henry David Thoreau</source> <dob-dod>1817-1862</dob-dod> <wplink>http://en.wikipedia.org/wiki/Henry_David_Thoreau</wplink> <wpimg>http://upload.wikimedia.org/wikipedia/commons/f/f0/Benjamin_D._Maxham_-_Henry_David_Thoreau_-_Restored.jpg</wpimg> <category>love</category> </record> </quotes>
问题原因
- PHP文件末尾的多余空白:如果代码末尾的
?>之后存在换行、空格等字符,会在echo XML后被输出,导致XML文档末尾出现额外内容 - CSV读取的无效行:
file()函数默认保留每行末尾的换行符,可能读取到空行,解析后生成无效的XML节点,或者破坏XML结构
解决方案
- 移除PHP闭合标签
?>,避免标签后出现意外输出 - 优化
file()函数参数,过滤空行并去除每行末尾的换行符 - 确保PHP文件没有UTF-8 BOM头(可通过编辑器设置去除)
修正后的代码
<?php // 读取CSV时过滤空行,去除每行末尾换行符 $csv = array_map(function($v){return str_getcsv($v, "|");},file('quotes.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)); $hdrs = array_shift($csv); $count = 0; $xml = '<?xml version="1.0" encoding="UTF-8"?>'; $xml .= '<quotes>'; foreach($csv as $k=>$v) { $xml .= '<record id="' . ++$count .'">'; foreach($hdrs as $h=>$i) { $xml .= '<' . $i . '>' . htmlspecialchars($v[$h], ENT_XML1, 'UTF-8') . '</' . $i . '>'; } $xml .= '</record>'; } $xml .= '</quotes>'; header ("Content-Type:text/xml"); echo $xml; // 移除闭合标签,避免额外输出
验证说明
修正后的代码会:
- 正确读取CSV内容,过滤无效空行
- 确保XML输出后没有任何额外字符
- 生成符合预期格式的XML文档
内容的提问来源于stack exchange,提问作者Carlo M
相关产品推荐
相关产品推荐

