在PHP的xmlwriter文档中如何换行

7

我有一个使用XMLWriter创建的XML源。在PHP 5.6 vagrant框中的开发环境中,它可以完美地工作。但是在运行PHP 5.4的生产服务器上,该源无法渲染,并显示以下错误信息:

This page contains the following errors:

error on line 3 at column 6: XML declaration allowed only at the start of the document

如果您查看源代码,它会像这样:

source

不知何故,在XML文档中添加了几行。服务器之间唯一的区别是PHP版本(据我所知)。
以下是XMLWriter代码的前几行:
$xml = new XMLWriter();
$xml->openURI('php://output');
$xml->startDocument("1.0");
$xml->setIndent(true);
$xml->startElement("propertyList");
$xml->writeAttribute('date', date('Y-m-d-H:i:s'));

有什么办法能够解决这个问题吗?

2
这不是你发布的代码 :) - 关于两个服务器之间的差异,请比较ini设置,例如有关输出缓冲、预置文件等设置。你的代码是否在版本控制下? - hakre
如果你生成的XML文件不是非常大,你可以将输出放入一个字符串中,并在保存到磁盘之前对其进行trim()处理。 - GordonM
2个回答

10

从PHP 5.4到5.6有不少变化... 更别提libxml中的变化了...

首先要做的显然是确保在开头的<?php标签之前没有空格,或者如果使用了关闭标签,则在关闭标签后也没有空格。

如果您能确定何时引入新行(假设它们是新行... 您是否使用过像十六进制查看器之类的东西?)那会很有帮助。尝试写入临时位置 - 希望确定这是否发生在服务页面时还是在xmlWriter输出时。

想到的事情...

  • 可能要明确indetString应该是什么。 $xml->setIndentString(" ");

  • 默认编码...? 可以尝试设置一下。期望在打开xml标记时出现... encoding="UTF-8"。使用startDocument('1.0', 'utf-8');,并且可能应该发送类似于header('Content-Type: application/xml; charset=UTF-8');的标题。你的default_charset是UTF-8吗?

  • 两个环境之间的其他区别是什么?类似short_open_tag之类的事情。

    • LIBXML_HTML_NOIMPLIED? 在5.4左右改变?

解决方法:

  • 在开始写入输出流之前尝试调用ob_clean

  • 使用trim

  • 升级服务器,现在谁还想使用5.4呢 :)


我尝试了所有的方法!但是简单的 ob_clean() 就创造了奇迹!谢谢。 - Daria

0

你的问题在于Header('Content-type: text/xml')的位置。

尝试这个方法,并确保在header()调用之前没有任何内容:

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

...

?>

我猜这可能对你有帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接