2015-08-04 6 views
8

Ich habe einen XML-Feed, den ich mit XMLWriter erstellt habe. Es funktioniert einwandfrei in einer PHP 5,6 Vagrant Box. Auf dem Live-Server, läuft PHP 5.4-Feed nicht mit einer Meldung zu machen:Zeilenumbrüche in PHP xmlwriter Dokument

This page contains the following errors: 

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

Wenn Sie Quelle sehen sieht es wie folgt aus:

source

Irgendwie gibt es ein paar Zeilen hinzugefügt in das XML-Dokument. Der einzige Unterschied zwischen den Servern ist die PHP-Version (soweit ich weiß).

Hier die ersten Zeilen des XMLWriter Code:

$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')); 

Irgendwelche Ideen, wie dies zu umgehen? offensichtlich sicherstellen, dass es vor dem Öffnen <?php Tag oder nach einem schließenden Tag

+2

Es ist nicht von dem Code, den Sie gepostet :) - Und für die Unterschiede zwischen den beiden Servern vergleichen Sie die Ini-Einstellungen, zum Beispiel diejenigen über die Ausgabe Pufferung, Dateien vorgeben etc .. Und haben Sie den Code unter Versionskontrolle ? – hakre

+0

Wenn die XML-Dateien, die Sie generieren, nicht riesig sind, können Sie die Ausgabe immer in eine Zeichenfolge einfügen und sie vor dem Speichern auf CD beschneiden(). – GordonM

Antwort

11

Nicht wenige Änderungen von PHP 5,4-5,6 ... allein Veränderungen in libxml lassen ...

Das erste, was verwendet kein weißer Raum ist, wenn .

Es würde helfen, wenn Sie feststellen können, wann die neuen Zeilen eingeführt werden (angenommen, sie sind neue Zeilen ... haben Sie so etwas wie einen Hex-Viewer verwendet?). Versuchen Sie, an einen temporären Speicherort zu schreiben - Sie möchten feststellen, ob dies beim Bereitstellen der Seite oder beim Ausgeben von xmlWriter passiert.

Dinge, die den Sinn kommen ...

  • sein Vielleicht explizit über das, was die indetString sein sollte. $xml->setIndentString(" ");

  • Standardcodierung ...? Vielleicht versuchen Sie, das Set zu bekommen. Erwarte beim Öffnen von xml-Tag ... encoding="UTF-8". Verwenden Sie startDocument('1.0', 'utf-8'); und wahrscheinlich sollte Header senden wie: header('Content-Type: application/xml; charset=UTF-8');. Ist Ihr default_charset UTF-8?

  • Welche anderen Unterschiede zwischen den beiden Umgebungen? Dinge wie short_open_tag usw.

    • LIBXML_HTML_NOIMPLIED? Um 5,4 geändert?

Umgehung:

  • einen Anruf Versuchen ob_clean bevor sie an den Ausgangsstrom zu schreiben beginnen.

  • Verwenden Sie trim.

  • Aktualisieren Sie den Server, der auf 5 sein möchte.4 in diesen Tagen :)

+0

Ein Alles versucht! Aber einfaches 'ob_clean()' machte ein Wunder! Vielen Dank. – Daria

1

Ihr Problem ist die Platzierung von Header ('Content-type: text/xml');

die Sie interessieren und stellen Sie sicher, es kommt nichts vor dem header() Aufruf:

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

... 

?> 

Ich denke, das könnte Ihnen helfen!