PHP simpleXML Wie speichere ich die Datei formatiert?


88

Ich versuche, einer vorhandenen XML-Datei mit SimpleXML von PHP einige Daten hinzuzufügen. Das Problem ist, dass alle Daten in einer einzigen Zeile hinzugefügt werden:

<name>blah</name><class>blah</class><area>blah</area> ...

Und so weiter. Alles in einer einzigen Zeile. Wie führe ich Zeilenumbrüche ein?

Wie mache ich das so?

<name>blah</name>
<class>blah</class>
<area>blah</area>

Ich benutze die asXML()Funktion.

Vielen Dank.


Es gibt auch das PEAR XML_Beautifier- Paket.
Karim79

Antworten:


147

Sie können die DOMDocument-Klasse verwenden, um Ihren Code neu zu formatieren:

$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($simpleXml->asXML());
echo $dom->saveXML();

Danke dir. Einfach und effizient.
Andrei Duma

3
Also ist es mit SimpleXML nicht möglich?
Jonathan

@ xcy7e Nein, das glaube ich nicht.
Gumbo

1
Als ich versuchte, Inhalte zu formatieren, die ich an eine Datei anhängte, funktionierte dies nur, wenn ich vor dem Laden des vorhandenen Inhalts "erveWhiteSpace "und" formatOutput "angegeben habe.
Sam

30

Gumbos Lösung macht den Trick. Sie können oben mit simpleXml arbeiten und diese am Ende hinzufügen, um sie zu wiederholen und / oder mit Formatierung zu speichern.

Der folgende Code gibt es wieder und speichert es in einer Datei (siehe Kommentare im Code und entferne alles, was du nicht willst):

//Format XML to save indented tree rather than one line
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($simpleXml->asXML());
//Echo XML - remove this and following line if echo not desired
echo $dom->saveXML();
//Save XML to file - remove this and following line if save not desired
$dom->save('fileName.xml');

19

Verwenden Sie dom_import_simplexmldiese Option, um in ein DomElement zu konvertieren. Verwenden Sie dann seine Kapazität zum Formatieren der Ausgabe.

$dom = dom_import_simplexml($simple_xml)->ownerDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
echo $dom->saveXML();

funktioniert nicht Die Funktion gibt ein DOMElement zurück, kein DOMDocument
karka91

Scheint documentElementsollte sein ownerDocument. Ich bin mir nicht sicher, ob sich die API geändert hat oder ob dies nur ein Tippfehler ist. Ich habe es jetzt korrigiert.
Troelskn

3
Bitte beachten Sie, dass dies immer noch nicht funktioniert, da vor dem Importieren des Dokuments dererveWhiteSpace und das FormatOutput festgelegt werden sollten , um eine Wirkung zu erzielen :)
karka91

Interessant - richtig du bist. Sieht so aus, als würde Gumbos Antwort funktionieren.
Troelskn

2

Wie Gumbo und Witman antworteten; Laden und Speichern eines XML-Dokuments aus einer vorhandenen Datei (wir sind hier viele Neulinge) mit DOMDocument :: load und DOMDocument :: save .

<?php
$xmlFile = 'filename.xml';
if( !file_exists($xmlFile) ) die('Missing file: ' . $xmlFile);
else
{
  $dom = new DOMDocument('1.0');
  $dom->preserveWhiteSpace = false;
  $dom->formatOutput = true;
  $dl = @$dom->load($xmlFile); // remove error control operator (@) to print any error message generated while loading.
  if ( !$dl ) die('Error while parsing the document: ' . $xmlFile);
  echo $dom->save($xmlFile);
}
?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.