Zeilenumbruch in XML Datei nicht simpleXML

karl123

Erfahrenes Mitglied
Hallo allerseits,

ich habe heute begonnen, mich mit XML etwas näher zu beschäftigen, habe also darin noch sehr wenig Ahnung.
Ich habe eine XML-Datei mit simplexml_load_file eingelesen. Dann habe ich einen zusätzlichen Datensatz mit addChild dazugetan und das Ergebnis mit asXML in einer anderen Datei abgespeichert.
Von der funktion her ist das alles ok, aber es gibt ein kleines Schönheitsproblem: bei meinem zusätzlichen Datensatz wird alles in eine Zeile geschrieben, ohne Zeilenumbruch und Einrücken.

Gibt es eine Möglichkeit, die Formatierung mit Zeilenumbrüchen und Einrücken mit simpleXML zu erzeugen? Wenn nicht, welche andere Möglichkeit gibt es?
 
Hi.
ich habe heute begonnen, mich mit XML etwas näher zu beschäftigen, habe also darin noch sehr wenig Ahnung.
Ich habe eine XML-Datei mit simplexml_load_file eingelesen. Dann habe ich einen zusätzlichen Datensatz mit addChild dazugetan und das Ergebnis mit asXML in einer anderen Datei abgespeichert.
Von der funktion her ist das alles ok, aber es gibt ein kleines Schönheitsproblem: bei meinem zusätzlichen Datensatz wird alles in eine Zeile geschrieben, ohne Zeilenumbruch und Einrücken.
Whitespace spielt bei XML normalerweise keine Rolle. XML definiert auch keine Formatierung so das man die Formatierung selbst vornehmen muss. (z.B. über eine Transformation zu XHTML mit CSS Auszeichnungen).
Gibt es eine Möglichkeit, die Formatierung mit Zeilenumbrüchen und Einrücken mit simpleXML zu erzeugen? Wenn nicht, welche andere Möglichkeit gibt es?
Wenn du von simpleXML redest, meinst du doch sicherlich PHP? Da müßtest du evtl. mal im PHP Forum fragen.

Gruß
 
Die Funktionalität ist ja gegeben. Danke für die Klarstellung dazu.

Dann werde ich die Frage mal bei PHP stellen.
 
Zeilenumbruch in XML Datei nit simpleXML

Hallo allerseits,

ich komme gerade aus dem XML-Forum, wo man mich hierher verwiesen hat. Hier also mein Problem:

Ich habe eine XML-Datei mit simplexml_load_file eingelesen. Dann habe ich einen zusätzlichen Datensatz mit addChild dazugetan und das Ergebnis mit asXML in einer anderen Datei abgespeichert.
Von der funktion her ist das alles ok, aber es gibt ein kleines Schönheitsproblem: bei meinem zusätzlichen Datensatz wird alles in eine Zeile geschrieben, ohne Zeilenumbruch und Einrücken.

Gibt es eine Möglichkeit, die Formatierung mit Zeilenumbrüchen und Einrücken mit simpleXML zu erzeugen? Wenn nicht, welche andere Möglichkeit gibt es?
 
Hi Karl,

simplexml selbst bietet da keine Möglichkeit, DomDocument anscheinend schon. Schau mal in die User Contributed Notes von [phpf]SimpleXMLElement::asXML[/phpf].

Und eröffne das nächste Mal bitte kein neues Thema, sondern bitte einen Moderator, Dein Thema zu verschieben.

LG
 
Beim nächsten Mal werde ich einen Moderator bitte. Ich habe das nicht gewusst oder vergessen.

Ich habe mir deinen Vorschlag angeschaut. Leider bin ich nicht so fit in der objektorientierten Programmierung. Ich habe den Vorschlag von mjijackson vom 27- Mai 2008 genommen und diese Klasse in meinen Code geschrieben.
Dann habe ich die xml-Datei mit simplexml_load_file geladen und meine Modifikationen durchgeführt. Am ende schreibe ich meine modifizierte Datei mit asPrettyXML. Irgendetwas scheine ich aber falsch zu machen, denn ich erhalte den Fehler
Call to undefined method SimpleXMLElement::asPrettyXML()
Muss die Klasse
class XMLElement extends SimpleXMLElement
sonstwo definiert werden?
 
Hi, wahrscheinlich hast du vergessen die neue Klasse als 2. Parameter an die Funktion zu übergeben. Es müsste in etwa so aussehen:
PHP:
$xml = simplexml_load_string($STRING, 'XMLElement');
Wobei du evtl. das 'XMLElement' durch den Namen deiner Klasse ersetzen musst, falls sie anders benannt wurde. Hoffe, das hilft dir weiter.
 
Ich habe es nicht vergessen - ich habe nicht gewusst, dass man das machen muss.:-(

Jetzt ist die Fehlermeldung weg, aber das Script funktioniert trotzdem nicht. Jetzt wird nichts geschrieben.

Hier noch einmal die Klasse:
PHP:
class XMLElement extends SimpleXMLElement
{
    /**
     * Outputs this element as pretty XML to increase readability.
     *
     * @param   int     $level      (optional) The number of spaces to use for
     *                              indentation, defaults to 4
     * @return  string              The XML output
     * @access  public
     */
    public function asPrettyXML($level = 2)
    {
        // get an array containing each XML element
        $xml = explode("\n", preg_replace('/>\s*</', ">\n<", $this->asXML()));
        // hold current indentation level
        $indent = 0;
        // hold the XML segments
        $pretty = array();
        // shift off opening XML tag if present
        if (count($xml) && preg_match('/^<\?\s*xml/', $xml[0])) {
            $pretty[] = array_shift($xml);
        }
        foreach ($xml as $el) {
            if (preg_match('/^<([\w])+[^>\/]*>$/U', $el)) {
                // opening tag, increase indent
                $pretty[] = str_repeat(' ', $indent) . $el;
                $indent += $level;
            } else {
                if (preg_match('/^<\/.+>$/', $el)) {
                    // closing tag, decrease indent
                    $indent -= $level;
                }
                $pretty[] = str_repeat(' ', $indent) . $el;
            }
        }
        return implode("\n", $pretty);
    }
}

So lese ich die vorhandene XML-Datei ein
PHP:
	$xml = simplexml_load_file($rootRieg.'/galleries.xml', 'XMLElement');

und so speichere ich die neue XML-Datei
PHP:
	$result = $xml->asPrettyXML($rootRieg.'/galleries2.xml');

Vielleicht weiß jemand Rat.
 
Hi Karl,

Du musst genauer hinschauen.
Die Methode asPrettyXML() von mjijackson erwartet eine Zahl als Parameter, keinen Dateinamen und schreibt deshalb auch keine Datei, sondern liefert den String zurück, den Du dann selbst noch in Deine Datei schreiben musst.

LG
 
Zurück