Guardar / Crear XML en PHP

   Como lo prometido es deuda, de hoy en adelante actualizaré mas a menudo el blog, y para ello comenzaré con una entrada que había dejado algo pendiente. Hace poco explicaba como leer archivos XML en PHP, sin embargo nunca explique como guardarlos (crearlos), para ello solo hace falta unas líneas de código.

   Asumiendo que sabemos la estructura básica de un XML, tomaré como referencia el ejemplo anterior, lo primero es declarar el XML:
$xml = new DomDocument('1.0', 'UTF-8');
   Podemos utilizar otras codificaciones, pero a modo de ejemplo seguiremos con utf-8. Luego de esto creamos el nodo principal o raíz:
$raiz = $xml->createElement('raiz');
$raiz = $xml->appendChild($raiz);
   Ahora solo nos queda rellenar dicho nodo con los sub-nodos consecuentes:
$nodo = $xml->createElement('libro');
$nodo = $raiz->appendChild($nodo);
   Como vemos, la forma de agregar nodos es básica y aplica para sub-nodos, por ejemplo:
$subnodo = $xml->createElement('item','texto dentro del item');
$subnodo = $nodo->appendChild($subnodo);
   Una vez hecho esto nuestro código esta listo, solo falta volcarlo a un archivo físico:
$xml->formatOutput = true;
$xml->saveXML();
$xml->save('ruta/archivo.xml');
   Aunque en esta parte podemos variar un poco, si queremos mostrar el XML tal cual como fue creado solo hace falta guardar la salida en una variable y utilizar la función htmlentities ($ xml ):
$el_xml = $xml->saveXML();
echo htmlentities($el_xml);
   Y si queremos no solo guardarlo, sino mostrarlo una vez finalice el proceso, podemos combinar ambas cosas y tener algo como esto:
<?php
  crear(); //Creamos el archivo
  leer();  //Luego lo leemos

  //Para crear el archivo
  function crear(){
    $xml = new DomDocument('1.0', 'UTF-8');

    $biblioteca = $xml->createElement('biblioteca');
    $biblioteca = $xml->appendChild($biblioteca);

    $libro = $xml->createElement('libro');
    $libro = $biblioteca->appendChild($libro);
    
    // Agregar un atributo al libro
    $libro->setAttribute('seccion', 'favoritos');

    $autor = $xml->createElement('autor','Paulo Coelho');
    $autor = $libro->appendChild($autor);

    $titulo = $xml->createElement('titulo','El Alquimista');
    $titulo = $libro->appendChild($titulo);

    $anio = $xml->createElement('anio','1988');
    $anio = $libro->appendChild($anio);

    $editorial = $xml->createElement('editorial','Maxico D.F. - Editorial Grijalbo');
    $editorial = $libro->appendChild($editorial);

    $xml->formatOutput = true;
    $el_xml = $xml->saveXML();
    $xml->save('libros.xml');

    //Mostramos el XML puro
    echo "<p><b>El XML ha sido creado.... Mostrando en texto plano:</b></p>".
         htmlentities($el_xml)."<br/><hr>";
  }

  //Para leerlo
  function leer(){
    echo "<p><b>Ahora mostrandolo con estilo</b></p>";
    $xml = simplexml_load_file('libros.xml');
    $salida ="";
    foreach($xml->libro as $item){
      $salida .=
        "<b>Autor:</b> " . $item->autor . "<br/>".
        "<b>Título:</b> " . $item->titulo . "<br/>".
        "<b>Ano:</b> " . $item->anio . "<br/>".
        "<b>Editorial:</b> " . $item->editorial . "<br/><hr/>";
    }
    echo $salida;
  }
?>


11 Comentarios

Escribir Comentario
Ricardo Cruz
AUTOR
20 de septiembre de 2015, 16:58 delete

Excelente información. Me serviría mucho para un sistema de ventas :) Gracias

Responder
avatar
Ricardo Cruz
AUTOR
8 de octubre de 2015, 10:51 delete

Muchas gracias por la información

Responder
avatar
Unknown
AUTOR
3 de febrero de 2016, 12:44 delete

con jquery no podría hacerse en vez de DOM?

Responder
avatar
2 de marzo de 2016, 13:06 delete

Si, pudieras leerlo con jQuery sin problemas, es solo un ejemplo utilizando PHP.

Responder
avatar
Unknown
AUTOR
2 de septiembre de 2016, 10:53 delete

Buen aporte, pero como seria de ponerle atributos a las etiquetas ejemplo e probado con esto $xml->writeAttribute('version', '1.0'); pero me da error.

Responder
avatar
7 de septiembre de 2016, 17:34 delete

Siguiendo con el ejemplo coloca justo después de agregar el libro a la biblioteca (append) lo siguiente: $libro->setAttribute('seccion', 'favoritos');... Igual ya he modificado el post, gracias por el comentario!

Responder
avatar
31 de mayo de 2017, 15:58 delete

Me ha servido el codigo tal cual esta. Gracias por el aporte

Responder
avatar
sdsds
AUTOR
16 de mayo de 2018, 20:24 delete

el atributo standalone="no" de xml como lo puedo ingresar ?

Responder
avatar
29 de mayo de 2018, 15:52 delete

Debido a que es una propiedad lo puedes setear de la siguiente forma:
$xml->xmlStandalone = false;

Responder
avatar
10 de enero de 2019, 17:41 delete

Muchas Gracias por tan excelente articulo que ha compartido sobre creacion y lectura de xml, felicitandole por su aporte para los que estamos aprendiendo a programar, de esta manera talves en una proxima oportunidad nos pudiera ayudar con temas de facturacion electronica en php....gracias y saludos

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión