saveXML()
saveXML() es un método de SimpleXML en PHP para serializar un objeto SimpleXMLElement a una cadena XML o guardarlo en un archivo.
Introducción
SimpleXML es una extensión de PHP que proporciona una API sencilla y fácil de usar para trabajar con documentos XML. El método SimpleXMLElement::saveXML() es la forma estándar de convertir un objeto SimpleXMLElement de vuelta en XML, ya sea como una cadena en memoria o como un archivo en disco.
Normalmente se utiliza saveXML() al final de un flujo de trabajo: después de cargar XML (con simplexml_load_string()) o de construirlo nodo a nodo (con addChild()), saveXML() serializa el resultado para que puedas devolverlo, almacenarlo o enviarlo por la red.
Este artículo cubre la firma del método, en qué se diferencia de asXML(), y recetas prácticas que incluyen el formateo con sangría.
Sintaxis
public SimpleXMLElement::saveXML(?string $filename = null): string|false$filename— Opcional. Si se proporciona, el XML se escribe en este archivo y el método devuelvetrueen caso de éxito ofalseen caso de error. El directorio de destino debe existir y ser escribible por el proceso PHP. Si se omite (valor por defecto), el método devuelve el XML como una cadena en lugar de escribir un archivo.- Valor de retorno — Una
stringque contiene el XML serializado cuando se omite$filename; unboolque indica el éxito cuando se proporciona$filename. Devuelvefalsesolo en caso de error.
SimpleXMLElement::saveXML()es un alias deSimpleXMLElement::asXML()— los dos métodos son intercambiables y aceptan el mismo argumento opcional$filename. Ten en cuenta que, a diferencia deDOMDocument::saveXML(), la versión de SimpleXML no acepta un argumento$options; pasar uno lanza unArgumentCountError.
Guardar XML en una cadena
Llama a saveXML() sin argumentos para obtener el documento como una cadena:
Esto imprime el documento completo, incluida la declaración XML:
<?xml version="1.0"?>
<book><title>PHP Basics</title></book>Creamos un SimpleXMLElement que representa un elemento book con un hijo title, y luego serializamos todo el árbol de vuelta a una cadena.
Construir XML antes de guardarlo
En código real, normalmente se construye el árbol dinámicamente con addChild() y se serializa al final:
<?php
$catalog = new SimpleXMLElement('<catalog></catalog>');
$book = $catalog->addChild('book');
$book->addChild('title', 'Learn PHP');
$book->addChild('author', 'W3docs');
echo $catalog->saveXML();Salida:
<?xml version="1.0"?>
<catalog><book><title>Learn PHP</title><author>W3docs</author></book></catalog>Guardar XML en un archivo
Pasa un nombre de archivo para escribir el documento directamente en disco. En este modo, saveXML() devuelve un booleano, así que compruébalo antes de asumir que la escritura fue exitosa:
<?php
$xml = new SimpleXMLElement('<book><title>PHP Basics</title></book>');
$success = $xml->saveXML('output.xml');
if ($success) {
echo "XML saved successfully.";
} else {
echo "Failed to save XML.";
}Un resultado false casi siempre significa un problema de permisos o de ruta: el directorio no existe o el proceso PHP no puede escribir en él.
Formatear la salida con sangría
SimpleXML serializa todo en una sola línea y no ofrece ningún indicador de formato. Para obtener XML legible con sangría, pasa la cadena a DOMDocument, que sí admite formatOutput:
<?php
$xml = new SimpleXMLElement('<catalog><book><title>Learn PHP</title></book></catalog>');
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml->saveXML());
echo $dom->saveXML();Salida:
<?xml version="1.0"?>
<catalog>
<book>
<title>Learn PHP</title>
</book>
</catalog>Conclusión
SimpleXMLElement::saveXML() es el paso de serialización del flujo de trabajo de SimpleXML: convierte un SimpleXMLElement en una cadena XML o lo escribe en un archivo usando una sintaxis orientada a objetos limpia. Recuerda que solo acepta un $filename opcional, que es un alias de asXML(), y que el formateo con sangría debe hacerse a través de DOMDocument. Para construir documentos antes de guardarlos, consulta addChild(); para la API completa, consulta la descripción general de SimpleXML.