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.