asXML()
Erfahren Sie, wie PHP's SimpleXMLElement::asXML() XML als String zurückgibt oder in eine Datei schreibt, mit Beispielen und häufigen Fallstricken.
Einführung
SimpleXMLElement::asXML() ist die Methode, die Sie aufrufen, wenn Sie mit SimpleXML fertig sind, XML aufzubauen oder zu bearbeiten, und das Ergebnis zurück erhalten möchten - entweder als string, den Sie ausgeben, zurückgeben oder speichern können, oder direkt in eine Datei geschrieben. Sie ist im Wesentlichen das Gegenteil von simplexml_load_string(): Während das Laden XML-Text in ein navigierbares object verwandelt, wandelt asXML() dieses object zurück in XML-Text um.
Diese Seite behandelt die zwei Modi, in denen die Methode arbeitet, was sie zurückgibt, wie sie sich bei einem einzelnen Knoten im Vergleich zum gesamten Dokument verhält, sowie die Fallstricke, die häufig zu Problemen führen (kein Pretty-Printing, keine XML-Deklaration bei Unterknoten).
Syntax
// Mode 1: return the XML as a string
public SimpleXMLElement::asXML(): string|false
// Mode 2: write the XML to a file, return true/false
public SimpleXMLElement::asXML(string $filename): bool$filename(optional) - Wenn angegeben, wird das XML in diesen Pfad geschrieben und die Methode gibt bei Erfolgtrueoder bei Fehlerfalsezurück. Wenn weggelassen, wird das XML stattdessen als string zurückgegeben.
asXML()undsaveXML()sind Aliase - sie tun genau dasselbe.
XML als String zurückgeben
Rufen Sie asXML() ohne Argument auf, um das Dokument als string zu erhalten. Dies ist die häufigste Verwendung - serialisieren und dann ausgeben, protokollieren oder als HTTP-Antwort-Body senden.
Ausgabe:
<?xml version="1.0"?>
<books><book><title>PHP Basics</title><author>John Doe</author></book></books>Wir bauen den Baum mit addChild() auf, dann serialisiert asXML() das Ganze. Beachten Sie, dass die Ausgabe in einer einzelnen Zeile steht - SimpleXML rückt nicht ein und gibt keine formatierte Ausgabe aus. Weitere Informationen finden Sie unter Fallstricke weiter unten.
asXML() auf einem einzelnen Knoten aufrufen
asXML() funktioniert auf jedem Element, nicht nur auf dem Dokumentstamm. Wenn es auf einem Kindknoten aufgerufen wird, serialisiert es nur diesen Knoten und seine Nachkommen - und wichtig: Es lässt die <?xml ... ?>-Deklaration weg, da ein Fragment kein eigenständiges Dokument ist.
<?php
$xml = new SimpleXMLElement(
'<books><book><title>PHP Basics</title></book></books>'
);
// Whole document - includes the XML declaration
echo $xml->asXML(), "\n";
// A single node - no declaration, just the fragment
echo $xml->book->title->asXML(), "\n";Ausgabe:
<?xml version="1.0"?>
<books><book><title>PHP Basics</title></book></books>
<title>PHP Basics</title>Damit eignet sich asXML() gut zum Extrahieren eines einzelnen Zweigs eines größeren Dokuments als eigenständiges Snippet.
XML in eine Datei schreiben
Übergeben Sie einen Dateinamen und asXML() schreibt das Dokument dort hin, anstatt einen string zurückzugeben. Der Rückgabewert ist ein boolean, den Sie überprüfen sollten, da das Schreiben fehlschlagen kann (falscher Pfad, keine Berechtigung, volle Festplatte).
<?php
$xml = new SimpleXMLElement('<config><host>localhost</host></config>');
if ($xml->asXML('config.xml')) {
echo "Saved successfully\n";
} else {
echo "Failed to write file\n";
}Wenn ein Dateiname angegeben wird, gibt asXML() true zurück (nicht den XML-string), versuchen Sie also nicht, dessen Ergebnis mit der Erwartung des Markups auszugeben.
Fallstricke
-
Kein Pretty-Printing.
asXML()gibt kompaktes, einzeiliges XML aus. Um es einzurücken, übergeben Sie den string an DOM:<?php $xml = new SimpleXMLElement('<a><b>hi</b></a>'); $dom = new DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->loadXML($xml->asXML()); echo $dom->saveXML();Ausgabe:
<?xml version="1.0"?> <a> <b>hi</b> </a> -
Die Ausgabe von Unterknoten enthält keine XML-Deklaration - nur der Dokumentstamm erzeugt die
<?xml ... ?>-Zeile. -
falsebedeutet Fehler. Beim Schreiben in eine Datei sollten Sie immer den boolean-Rückgabewert prüfen, anstatt Erfolg vorauszusetzen.
Verwandte Themen
addChild()- Bauen Sie den Baum auf, den Sie mitasXML()serialisieren.saveXML()- Der Alias vonasXML().children()undattributes()- Navigieren Sie das object vor der Serialisierung.- Einführung in SimpleXML - Das größere Bild der SimpleXML-Erweiterung.
Fazit
SimpleXMLElement::asXML() serialisiert ein SimpleXML-object zurück in XML-Text. Ohne Argument gibt es das Markup als string zurück; mit einem Dateinamen schreibt es das Dokument auf die Festplatte und gibt einen boolean zurück. Denken Sie daran, dass es kompakte Ausgabe erzeugt (verwenden Sie DOM, wenn Sie Einrückung benötigen), und dass der Aufruf auf einem Kindknoten ein Fragment ohne Deklaration liefert.