【问题标题】:Line breaks in PHP xmlwriter documentPHP xmlwriter 文档中的换行符
【发布时间】:2015-10-26 08:08:17
【问题描述】:

我有一个使用 XMLWriter 创建的 XML 提要。它在 PHP 5.6 vagrant box 上的 dev 中完美运行。在实时服务器上,运行 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

如果你查看源代码,它看起来像这样:

不知何故,有几行被添加到 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'));

任何想法如何解决这个问题?

【问题讨论】:

  • 这不是来自您发布的代码:) - 对于两台服务器之间的差异,请比较 ini 设置,例如关于输出缓冲、前置文件等的设置。你有版本控制下的代码?
  • 如果您生成的 XML 文件不是很大,您总是可以将输出放入一个字符串并在将其保存到光盘之前对其进行 trim()。

标签: php xml php-5.4 php-5.6


【解决方案1】:

从 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()却创造了奇迹!谢谢。
【解决方案2】:

您的问题是 Header('Content-type: text/xml');

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

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

...

?>

我想这对你有帮助!

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多