Siguiendo un poco el contenido de las ultimas entradas del blog, hoy voy a explicar como leer un XML desde PHP.
Antes de empezar voy a explicar que es un XML y de las definiciones posibles la que mas se ajusta es esta: «Meta-lenguaje que permite definir lenguajes de marcas para almacenar datos en forma legible»
De manera resumida se trata de un formato de origen de datos muy usado en la web, para tener mas información podeis consultar la entrada en la wikipedia: https://es.wikipedia.org/wiki/Extensible_Markup_Language
Un ejemplo de XML:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE Edit_Mensaje SYSTEM "Edit_Mensaje.dtd"> <Edit_Mensaje> <Mensaje> <Remitente> <Nombre>Nombre del remitente</Nombre> <Mail> Correo del remitente </Mail> </Remitente> <Destinatario> <Nombre>Nombre del destinatario</Nombre> <Mail>Correo del destinatario</Mail> </Destinatario> <Texto> <Asunto> Este es mi documento con una estructura muy sencilla no contiene atributos ni entidades... </Asunto> <Parrafo> Este es mi documento con una estructura muy sencilla no contiene atributos ni entidades... </Parrafo> </Texto> </Mensaje> </Edit_Mensaje>
En el ejemplo se puede ver claramente como se estructuran los datos de una manera ordenada y legible.
Para el programa vamos a utlizar, como ya vimos en post anteriores, el catalago de datos del ayuntamiento de Gijón https://transparencia.gijon.es/page/1808-catalogo-de-datos que los ofrece de manera publica y los hay de todo tipo.
Vamos a utilizar el listado de playas : http://datos.gijon.es/doc/turismo/playas.xml
Lo primero que haremos es utilizar la función simplexml_load_file que es la que nos permite trabajr con ficheros XML en PHP.
Lo que haremos es guardar el XML en una variable $data:
$data = simplexml_load_file('http://datos.gijon.es/doc/turismo/playas.xml')
En el xml las playas vienen formadas de la siguiente manera:
<directorio rdfa-id="http://www.gijon.es/directorios/show/1232-playa-de-serin" tipo="Playas,Medio Ambiente"> <url>http://www.gijon.es/directorios/show/1232-playa-de-serin</url> <foto rdfa-property="http://purl.org/dc/terms/relation">http://www.gijon.es/data/images/f6/6917/250x194_v1_DirectorioPlayasserin.jpg</foto> <nombre rdfa-property="http://www.geonames.org/ontology#name">Playa de Serín</nombre> <descripcion rdfa-property="http://purl.org/dc/terms/description">Acceso por la GI-2,desviándonos a la altura de la ermita de la Providencia. Frecuentada por nudistas-naturistas.Afluencia escasa.Arenal escaso.Baño con precaución, teniendo en cuenta su fondo rocoso.350 metros.Papeleras y contenedores. Accesos urbanizados (escalones). Líneas de autobús:14 y 25.Pesca submarina y buceo autónomo. Servicio de vigilancia: 1 vigilante.</descripcion> <localizacion rdfa-property="http://www.w3.org/2002/12/cal#location">43.551044 -5.611664</localizacion> </directorio>
Para mostrar los elementos del XML usaremos un bucle foreach:
foreach($data as $item){}
Y para mostrar los elementos utilizaremos su nomenclatura dentro del XML:
echo $item->descripcion;
El resultado final mostrado en una tabla seria el siguiente:
El codigo utilizado para el ejemplo es el siguiente y lo podeis ver aqui en funcionamiento: http://programacionconphp.com/dev/readXML/ :
<?php // index.php // ubicacion XML online y local define('XML', 'http://datos.gijon.es/doc/turismo/playas.xml'); define('XMLlocal', 'playas.xml'); // leer XML validamos si el fichero online e accesible y si no abrimos el XML local if($data = simplexml_load_file(XML)){ } else{ $data = simplexml_load_file(XMLlocal); } ?> <html> <h1>Playas de Gijón</h1> <?php //bucle para recorrer los elementos del array foreach($data as $item){ ?> <table border="1"> <tr> <td>Nombre: </td> <td> <?php echo $item->nombre; ?> </td> </tr> <tr> <td>URL: </td> <td> <?php echo $item->url; ?> </td> </tr> <tr> <td>Descripcion: </td> <td> <?php echo $item->descripcion; ?> </td> </tr> <tr> <td>Direccion: </td> <td> <?php echo $item->direccion; ?> </td> </tr> <tr> <td>Foto: </td> <td> <?php echo '<img src=' . $item->foto . '/>'; ?> </td> </tr> <tr> <td>Localizacion: </td> <td> <?php echo '<a href="https://www.google.com/maps/place/' . $item->localizacion . '">' . $item->localizacion . '</a>'; ?> </td> </tr> </table><br /> <?php } //cerramos bucle ?> </html>
Y lo teneis disponible para su descarga aqui: https://github.com/victorgarciasisi/readXML