Utilizar archivos XML con PHP
Categorías : PHP, HTML, XML, Programación.

XML son las siglas de eXtensible Markup Language, y en esencia es un lenguaje que permite a los desarrolladores crear sus propias etiquetas para definir un conjunto de información.
Pero que podemos hacer con XML? Por si solo no es más que un archivo de datos, que con PHP puede ser interpretado muy fácilmente.
Por poner un ejemplo, vamos a imaginarnos que queremos hacer una lista de datos, y que queremos mostrar esa lista de datos en varios documentos PHP. Esto podríamos hacerlo con un archivo de texto a base de fopen / fread, con una conexión mysql extrayendo dichos datos de una base de datos, o utilizando un archivo XML.
Si lo hacemos con un archivo de texto plano, nos tendríamos que crear nuestras propias reglas dentro del archivo para distinguir la información, cosa que aumentaría considerablemente el trabajo de programación.
Si utilizamos una base de datos, la información ya la tendríamos ordenada, pero cada vez que quisiéramos modificar esa lista de datos tendríamos que acceder a myphpadmin, o hacernos una página PHP para introducir datos, lo cual también acarrea trabajo extra.
En cambio si utilizamos XML solo tenemos que editar dicho archivo y añadir / eliminar las etiquetas pertinentes para modificar la lista de información a nuestro antojo.
PHP dispone de varias funciones para facilitar la interacción con archivos XML, en especial hoy vamos a tratar con estas tres : xml_parser_create, xml_parse_into_struct, xml_parser_free.
La función xml_parser_create crea un intérprete XML y devuelve su identificador para poder utilizarlo en otras funciones XML.
La función xml_parse_into_struct crea un array de datos con todo el contenido XML especificado dividido por etiquetas.
La función xml_parser_free libera un intérprete XML generado anteriormente con xml_parser_create.
Veamos un ejemplo en PHP para abrir y parsear un archivo XML :
function LeerContenidoXML($Archivo) {$ArchivoLista = fopen($Archivo, "r", true);$DatosArchivo = fread($ArchivoLista, filesize($Archivo));fclose($ArchivoLista);$Parser = xml_parser_create();xml_parse_into_struct($Parser, $DatosArchivo, $Valores, $Indices);xml_parser_free($Parser);return $Valores;}
Por ejemplo en www.devildrey33.es el archivo index.php se genera automáticamente a partir de un archivo XML. En este archivo se indican todas las entradas, y a que categorías pertenece cada entrada. Veamos como quedaría el XML con las 5 últimas entradas de esta web :
<Contenidos><Entrada Nombre="Utilizar archivos XML con PHP" Dia="10" Mes="Octubre" Any="2011" URL="PHPyXML.php" /><Entrada Nombre="Crear servidor web de pruebas portatil" Dia="07" Mes="Octubre" Any="2011" URL="XamppUSB.php" /><Entrada Nombre="Creación de feeds RSS" Dia="06" Mes="Octubre" Any="2011" URL="FeedsRSS.php" /><Entrada Nombre="C++ 4 Creación de archivos DUMP" Dia="05" Mes="Octubre" Any="2011" URL="Tutorial_WINAPI_4.php" /><Entrada Nombre="ComboBox para la web" Dia="04" Mes="Octubre" Any="2011" URL="ComboBoxWeb.php" /><Categoria Nombre='Cpp'><EntradaCategoria Nombre="C++ 4 Creación de archivos DUMP" /></Categoria><Categoria Nombre='PHP'><EntradaCategoria Nombre="Utilizar archivos XML con PHP" /><EntradaCategoria Nombre="ComboBox para la web" /></Categoria><Categoria Nombre='Windows'><EntradaCategoria Nombre="Crear servidor web de pruebas portatil" /><EntradaCategoria Nombre="Tutorial C++ 4 Creación de archivos DUMP" /></Categoria><Categoria Nombre='Web'><EntradaCategoria Nombre="Utilizar archivos XML con PHP" /><EntradaCategoria Nombre="Crear servidor web de pruebas portatil" /><EntradaCategoria Nombre="Creación de feeds RSS" /><EntradaCategoria Nombre="ComboBox para la web" /></Categoria></Contenidos>
Ahora que ya conocemos la estructura del archivo XML y sabemos como parsear un archivo XML dentro de un array, veamos cómo podemos extraer los datos de dicho array :
function MostrarDatosXML() {$DatosXML = LeerContenidoXML("PHPyXML_Ejemplo.xml");foreach ($DatosXML as $Etiqueta) {// Se ha encontrado una Entradaif ($Etiqueta['tag'] == "ENTRADA" && $Etiqueta['type'] == "complete") {$Nombre = $Etiqueta['attributes']['NOMBRE'];$Dia = $Etiqueta['attributes']['DIA'];$Mes = $Etiqueta['attributes']['MES'];$Any = $Etiqueta['attributes']['ANY'];$Url = $Etiqueta['attributes']['URL'];echo "<a href='$Url'>$Nombre</a> creado el $Dia de $Mes del $Any<br />";}// Se ha encontrado el inicio de una Categoriaif ($Etiqueta['tag'] == "CATEGORIA" && $Etiqueta['type'] == "open")echo "<ul>".$Etiqueta['attributes']['NOMBRE'];// Se ha encontrado el final de una Categoriaif ($Etiqueta['tag'] == "CATEGORIA" && $Etiqueta['type'] == "close")echo "</ul>";// Se ha encontrado una Entrada de una Categoriaif ($Etiqueta['tag'] == "ENTRADACATEGORIA" && $Etiqueta['type'] == "complete")echo "<li>".$Etiqueta['attributes']['NOMBRE']."</li>";}}
Hay que destacar que se pueden especificar datos de dos formas dentro de una etiqueta. La primera es en forma de atributos, como serian : Nombre, Dia, Mes, Any, y Url. La otra forma seria añadir datos dentro de la etiqueta, por ejemplo "<Entrada>Mi entrada</Entrada>", y para acceder al texto "Mi entrada" deberíamos acceder al atributo 'value' al encontrar una etiqueta ENTRADA con el 'type' open.
En cuanto a la función del ejemplo anterior, en esencia recorremos cada etiqueta que existe en el array DatosXML, la identificamos y la imprimimos en el documento final con un 'echo'.
Hay que destacar que existen 3 tipos de etiquetas : 'complete', 'open' y 'close'.
Es muy simple una etiqueta 'complete' es la que termina con una '/' al final, por ejemplo "<EntradaCategoria Nombre='Nombre' />".
Una etiqueta 'open' es una etiqueta que no tiene ninguna '/' y sirve para indicar el inicio de ese campo. Y una etiqueta 'close' es la que empieza con una '/', y indica que se ha terminado el contenido de dicha etiqueta.
Y esto es todo por hoy, podeis descargar el ejemplo de este tutorial, y ver como quedaria la pagina web una vez hecho el parsing al archivo XML.
Ver Ejemplo | Descargar Ejemplo |