2015-08-04 3 views
8

У меня есть XML-канал, который я создал с помощью XMLWriter. Он работает безупречно в dev на брандмаутере PHP 5.6. На живом сервере работает PHP 5.4 фид не может сделать с сообщением:Разрывы строк в PHP xmlwriter document

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-settings, например, о буферизации вывода, файлах-подписях и т. Д. И у вас есть код под управлением версии ? – hakre

+0

Если файлы XML, которые вы генерируете, не являются огромными, вы всегда можете поместить вывод в строку и trim(), прежде чем сохранять его на диск. – GordonM

ответ

11

Довольно много изменений с 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 в эти дни :)

+0

A попробовал ВСЕ! Но простой 'ob_clean()' сделал чудо! Спасибо. – Daria

1

Ваша проблема заключается в размещении заголовка ('Content-type: text/xml');

Попробуйте и убедитесь, что не НИЧЕГО предшествует заголовок() вызов:

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

... 

?> 

Я думаю, это может помочь вам!

Смежные вопросы