XML mit richtiger Formatierung speichern
DerMambo
- php
Hallo zusammen,
ich hab schon seit Längerem ein Problem und dazu noch keine adäquate Lösung gefunden.
Ich lade per PHP (DOM) eine XML Datei als Basis für den Content einer Website. Dabei können zB. auch Inhalte hinzugefügt werden. Drücke ich einen Knopf wird in die XML-Datei der neue Inhalt eingefügt.
Das Problem ist, in der XML-Datei wird das neue XML-Element in einer einzigen Zeile geschrieben, nicht aber mit Zeilenumbrüchen. Das führt dazu, dass JavaScript die XML-Datei nicht korrekt darstellen kann.
Angenommen ich habe diese XML-Datei:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE content SYSTEM "content.dtd">
<content id="root">
<folder id="fold_1">
<link id="tree_1" linkText="Ordner" url="#"/>
<head>Ordner</head>
<text>Der Prozess: Ordner</text>
</folder>
</content>
Dann füge ich über einen Knopfdruck einen neuen "folder" hinzu, dann entsteht folgendes:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE content SYSTEM "content.dtd">
<content id="root">
<folder id="fold_1">
<link id="tree_1" linkText="Ordner" url="#"/>
<head>Ordner</head>
<text>Der Prozess: Ordner</text>
</folder>
<folder id="fold_2"><link id="tree_2" linkText="Ordner" url="#"/><head>Ordner</head><text>Der Prozess: Ordner</text></folder></content>
Der Folder mit id="fold_2" wird in nur einer einzigen Zeile angezeigt, es fehlen die Zeilenumbrüche.
In PhP sieht das kurzgefasst so aus:
$dom = new DomDocument('1.0', 'ISO-8859-1');
$dom -> formatOutput = true; // bringt irgendwie auch nix...
$dom->load('content.xml');
$newFolder = createFolder($foldID); //neuen Ordner erstellen
$appendNode = getCategory($id); //finde den Ordner wo es angehangen werden soll
$appendNode->parentNode->appendChild($newFolder); //hänge Ordner an
$dom->save('content.xml'); // speichere das neue XML-Dokument
Der PHP-Code ist nicht komplett sollte aber die Vorgehensweise deutlich machen.
Ich habe eine Vermutung, auch schon in die Richtung getestet aber ohne Erfolg. Ich glaube, dass nach den einzelnen Elementen zB. "<folder id="fold_2">" die #text-Elemente fehlen. Habe schon versucht überall TextNodes anzubauen, hat auch nicht wirklich geholfen...
Wenn jemand eine Idee hat wäre ich sehr dankbar.
Ich habe mal versehentlich einen folder "zu weit oben" angehangen. also eine ebene über dem Root-Element (content). Da wurde dann das element richtig dargestellt:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE content SYSTEM "content.dtd">
<content id="root">
</content>
<folder id="fold_1">
<link id="tree_1" linkText="Ordner" url="#"/>
<head>Ordner</head>
<text>Der Prozess: Ordner</text>
</folder>
ist nur nicht ganz das, was ich brauche ;)
Grüße,
Manuel
Hallo!
In dieser Reihenfolge
[...]$dom = new DomDocument('1.0', 'ISO-8859-1');
/***/
$dom->preserveWhiteSpace = false;
/***/
$dom->load('content.xml');
$dom -> formatOutput = true; // bringt irgendwie auch nix...
und mit der Ergänzung zwischen den "/***/" klappt's bei mir mit der Einrückung unter
WinXP mit PHP 5.2.6 (cli)
Allerdings habe ich keine DTD geladen; keine Attribute eingefügt usw:
$newFolder = $dom->createElement("folder");
$root = $dom->documentElement;
$root->appendChild($newFolder);
$newLink = $dom->createElement("link");
$newFolder->appendChild($newLink);
$dom->save('content.xml');
Aber ich denke das löst das Problem.
Der "Trick" stammt aus der Doku zu saveXML
Grüsse
Solkar
Wahnsinn, vielen Dank!
Klapt auf Anhieb perfekt. Sehr ärgerlich nur, dass ich es nicht vorher gefunden habe ;-)
Ich musste vorher mit suchen-ersetzen jedes mal die formatierung anpassen, sehr nervig und in einer fertigen Version natürlich unzumutbar.
Noch mal vielen Dank für den Tip !
Grüße,
Manuel