XML y PHP

El uso de formularios es algo básico en cualquier web o aplicación que se precie. Aquí, en Katharsix, ya hemos visto como hacer formularios en PHP muy básicos para introducir datos en un formulario de contacto o para añadir elementos, por ejemplo, a una base de datos.

Problema: ¿y si quiero añadir varios elementos con un mismo formulario? ¿y si quisiera posteriormente modificar algún campo del elemento que inserté anteriormente? Para eso necesitaremos la ayuda de algún método que almacene temporal o permanentemente esos datos y alguna manera de recogerlos y modificarlos. Nosotros optaremos por lo más sencillo: el uso de ficheros XML.

Aclarar que existen muchas formas de encarar las cuestiones mencionadas arriba. El método que explicaremos a continuación es mediante el uso básico de estos ficheros con la ayuda de formularios en HTML y PHP. En otras palabras: vamos a ver cómo leer y escribir datos desde/en un fichero XML. Muy sencillo.

Escribir en XML

Lo primero que necesitaremos será un formulario en HTML. Para no complicarnos mucho vamos a hacer uno auqe tenga dos campos de texto (nombre y apellido, por ejemplo) y un botón de enviar. Nos quedaría algo así:

Nombre: Apellido:

Como vemos necesitamos tener un fichero PHP (test1.php) que será quien cree y escriba los datos en el fichero XML que le digamos. Lo incluimos dentro del atributo action del form. También tenemos que recordar los valores que pongamos en el atributo NAME de cada input del form.

Lo primero que tenemos que tener clara es la estructura de XML. Aquí a gusto del consumidor. Yo utilizaré una muy sencilla: una etiqueta ‘persona’ que a su vez contenga otras dos para ‘nombre’ y ‘apellido’. Para jugar un poco con los atributos de XML le meteremos la fecha en la que se ha creado esa persona.

El código PHP, por tanto, será algo tal que así:

< ?php
// Recogemos los valores introducidos en el form
$a1 = $_POST['nombre'];
$a2 = $_POST['apellido'];

// Creamos el fichero XML y su estructura
$dom = new DomDocument("1.0", "UTF-8");

// Defiminos el nodo persona
$persona = $dom->createElement('persona');

// Definimos el atributo de persona 'fecha', llamaremos a una función
// PHP que obtiene la fecha actual en un formato específico
$persona->setAttribute('fecha', date('Ymd'));

// Campos o nodos de persona
$persona->appendChild( $dom->createElement('nombre', $a1) );
$persona->appendChild( $dom->createElement('apellido', $a2) );

// Insertamos el elemento persona en la raiz
$dom->appendChild( $persona );

// Cerramos el fichero
$xmlData = $dom->saveXML();

// Le damos formato (para que no lo muestre todo seguido
// sin saltos de línea)
$dom->formatOutput = true;

// Guardar el xml como String...
$strings_xml = $dom->saveXML();

// ... e indicamos dónde queremos guardarlo (ruta)
$dom->save('XML/test.xml'); 

echo "Archivo XML generado correctamente";
echo "";
echo "Descargar: AQUI";
?>

Está comentado paso a paso. Como veis esto nos generaría un fichero llamado test.xml dentro de la carpeta XML del directorio raiz donde tengamos el formulario. Dicho directorio deberá tener permisos de escritura para que se pueda generar correctamente el fichero.

Leer en XML

Para leer un fichero tendremos que cambiar un poco nuestro HTML. en este caso solo tendremos un botón para subir nuestro archivo y un botón para enviar. Quedaría de la siguiente manera:

En el PHP tendremos que parsear el fichero XML para luego mostrar cada campo. En este caso es un poco más complejo pero se entiende bastante bien. La primera parte del código es una verificación típica de que el fichero que vamos a subir es XML y que no ocupa más de 20KB (en este caso). No me pararé a explicarla en detalle esa parte pero si alguien no lo entiende… que deje un comentario.

< ?php 
/* ------ SUBIMOS EL ARCHIVO XML ------- */
$allowedExts = array("xml");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "text/xml"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "ERROR: " . $_FILES["file"]["error"] . "";
    }
  else
    {
    if (file_exists("XML/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " ya existe. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "XML/" . $_FILES["file"]["name"]);
      echo "Guardado en: " . "XML/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "ERROR. El fichero debe ser XML";
  }

/* ------ LEEMOS EL XML ------- */
$doc = new DOMDocument();

// Cargamos el fichero XML
$doc->load( "XML/" . $_FILES["file"]["name"] );

// Obtenemos el nodo 'persona'
$personas = $doc->getElementsByTagName( "persona" );

// Utilizamos un foreach aunque no sería necesario en nuestro caso
// porque solo existe una persona. Esto funcionaría para el caso
// de tener varias personas definidas con sus respectivos campos
// en el XML
foreach( $personas as $persona )
{
// Recogemos todas las etiquetas 'nombre'
$nombres = $persona->getElementsByTagName( "nombre" );

// Recogemos el valor de la que nos interesa
$nombre = $nombres->item(0)->nodeValue;

// Hacemos lo mismo para el apellido
$apellidos = $persona->getElementsByTagName( "apellido" );
$apellido = $apellidos->item(0)->nodeValue;

echo "Datos de la persona: $nombre - $apellidon";
?>

De esta manera nos muestra los datos de la persona que habíamos insertado en el primer ejemplo.

Si tenéis alguna pregunta, lo dicho: dejarnos un comentario y trataremos de ayudarte.