Icono del sitio Tursos

Como Leer un Archivo XML con PHP

En este tutorial vamos a aprender a utilizar la funcion simpleXML, presente solo en PHP5+ para leer y obtener los datos de un archivo XML de la forma mas sencilla posible.

¿Qué es XML?

El lenguaje XML se compone por las  siglas en ingles de eXtensible Markup Language que en español significa “Lenguaje de marcas extensible”, no es realmente un lenguaje pero se asemeja a HTML porque tiene etiquetas que se abren y se cierran.

Un archivo XML es por ejemplo el canal RSS de este blog, este fichero contiene los datos de los ultimas entradas publicadas, si vamos a su código fuente veríamos algo parecido a esto:

<channel>
	<title>WebTursos</title>
	<link>https://tursos.com</link>
	<description>Tutoriales de diseño y desarrollo web en español</description>
	<lastBuildDate>Wed, 10 Aug 2011 16:34:36 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>

	<language>en</language>
	<!-- generator="WordPress/3.2.1" -->

	<item>
		<title>Como hacer un formulario de contacto II – Validar con jQuery</title>
		<description><![CDATA[En esta segunda parte vamos a aprender a validar con jQuery el formulario que hicimos en el <a target="_blank" href='https://tursos.com/tutoriales/html-css/como-hacer-un-formulario-de-contacto-i-html-y-css'>tutorial anterior</a>.]]></description>
		<link>https://tursos.com/tutoriales/javascript/como-hacer-un-formulario-de-contacto-ii-validar-con-jquery</link>

			</item>
	<item>
		<title>Nuevo Sitio: PsTursos – Recursos y Tutoriales de Photoshop</title>
		<description><![CDATA[Me es grato anunciar que acabamos de lanzar nuestro segundo blog de tutoriales: <a href="http://ps.tursos.com/" title="PsTursos - Recursos y Tutoriales de Photoshop">PsTursos</a> este es un sitio focalizado unicamente en lo relacionado a Photoshop.]]></description>
		<link>https://tursos.com/articulos/noticias/nuevo-sitio-pstursos-recursos-y-tutoriales-de-photoshop</link>
			</item>
	<item>

		<title>Como hacer un formulario de contacto I – HTML y CSS</title>
		<description><![CDATA[En este tutorial construiremos un formulario de contacto funcional y validado desde cero, en esta primera parte veremos como hacer la estructura en HTML y los estilos en CSS.]]></description>
		<link>https://tursos.com/tutoriales/html-css/como-hacer-un-formulario-de-contacto-i-html-y-css</link>
			</item>
</channel>

Como podéis ver un documento XML se compone de montones de etiquetas y cada una contiene información, lo que haremos en este tutorial sera obtener la información que contienen estas etiquetas y mostrarla en una pagina PHP.

Introducción a SimpleXML

SimpleXML es una nueva función introducida con PHP5, lo que hace es generar un Objeto teniendo como base un documento XML que le indiquemos, supongamos que tenemos un documento XML donde tenemos una lista de alumnos y cada item contiene el nombre y la fecha de nacimiento declarada como un atributo:

<rss>
<alumnos>
    <alumno fechadenac="30/09/1992">
        <nombre>Juan</nombre>
    </alumno>
    <alumno fechadenac="30/09/1992">
        <nombre>Jorge</nombre>
    </alumno>
    <alumno fechadenac="30/09/1992">
        <nombre>Josue</nombre>
    </alumno>
</alumnos>
</rss>

Lo primero que se tiene que hacer es declarar la ubicación de este XML:

<?php
    $alumnos= simplexml_load_file('alumnos.xml'); //declaramos una variable y llamamos a la funcion simpleXML y declaramos la ubicacion del XML a leer
?>

Luego si queremos mostrar el nombre del primer alumno lo que hacemos es mostrar la variable y luego ir navegando entre etiquetas hasta obtener el valor que queremos (alumnos->alumno->nombre):

<?php
    $alumnos= simplexml_load_file('alumnos.xml');
	echo $alumnos->alumnos->alumno[0]->nombre;
?>

Y nos resultaría el nombre del primer alumno:

Juan

alumno[0] vendria a ser el primer objeto del XML, ya que en Arrays el indice empieza en 0.
Y si queremos obtener el nombre del tercer alumno, solo cambiamos el 0 por el 2:

<?php
    $alumnos= simplexml_load_file('alumnos.xml');
	echo $alumnos->alumnos->alumno[2]->title;
?>
Jorge

Obtener atributos

Tambien podemos leer los atributos de los objetos, por ejemplo si quisieramos obtener el atributo declarado como fechadenac, usaríamos un código parecido a este, donde declaramos el nombre del atributo a obtener entre corchetes:

<?php
    $alumnos= simplexml_load_file('alumnos.xml');
	echo $alumnos->alumnos->alumno[0]['fechadenac']; //nota que primero se declara que objeto a obtener ([0]) y luego que atributo a obtener
?>
30/09/1992

Un ejemplo más complejo

Un uso practico que le podríamos dar a esta función seria la de obtener los datos y crear una lista de todos los items del XML, vamos a hacer un ejemplo que obtenga los ultimos posts de este blog, y haciendo uso de foreach los muestre como una lista:

<?php
    $mispost = simplexml_load_file('https://tursos.com/feed/rss'); //declaramos la ubicacion del XML
    echo "<ul>"; // empieza la lista
    foreach ($mispost->channel->item as $post):
        $title=$post->title; // declaracion de variables
        $link=$post->link;
        $description=$post->description;
        echo "<li><strong><a href='".$link."'>".$title."</a></strong><div>".$description."</div></li>"; // muestra la lista
    endforeach;
    echo "</ul>";
?>

Resultado:


Un ejemplo aún más complejo

Con esta misma función incluso podemos obtener y mostrar una galeria entera de Flickr, para este ejemplo vamos a usar este Set de fotografías:

Como podéis ver, los sets de fotos en Flickr disponen de un canal RSS:

Vamos al codigo fuente del canal RSS y lo que vemos seria algo asi:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:dc="http://purl.org/dc/elements/1.1/"
      xmlns:flickr="urn:flickr:"
      xmlns:media="http://search.yahoo.com/mrss/">

  <title>Content from Panoramas</title>
  <link rel="self" href="http://api.flickr.com/services/feeds/photoset.gne?set=72157603216680990&nsid=73845487@N00&lang=en-us" />
  <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/planetoftheweb/sets/72157603216680990"/>
  <id>tag:flickr.com,2005:http://www.flickr.com/photos/73845487@N00/sets/72157603216680990</id>
  <icon>http://farm3.static.flickr.com/2291/2040444567_e7a3ffe334_s.jpg</icon>
  <subtitle>My collection of Panoramas.</subtitle>
  <updated>2011-05-23T14:48:42Z</updated>
  <generator uri="http://www.flickr.com/">Flickr</generator>

  <entry>
    <title>Vancouver Port</title>
    <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/planetoftheweb/5750645835/in/set-72157603216680990/"/>
    <id>tag:flickr.com,2005:/photo/5750645835/in/set-72157603216680990</id>
    <published>2011-05-23T14:48:42Z</published>
    <updated>2011-05-23T14:48:42Z</updated>
    <dc:date.Taken>2011-05-07T23:53:28-08:00</dc:date.Taken>
    <content type="html">			<p><a href="http://www.flickr.com/people/planetoftheweb/">planetoftheweb</a> posted a photo:</p>

<p><a href="http://www.flickr.com/photos/planetoftheweb/5750645835/" title="Vancouver Port"><img src="http://farm4.static.flickr.com/3588/5750645835_1902a86cd6_m.jpg" width="240" height="160" alt="Vancouver Port" /></a></p>

<p>Another photo from my trip to Vancouver</p></content>
    <author>
      <name>planetoftheweb</name>
      <uri>http://www.flickr.com/people/planetoftheweb/</uri>
      <flickr:nsid>73845487@N00</flickr:nsid>
    </author>
    <link rel="enclosure" type="image/jpeg" href="http://farm4.static.flickr.com/3588/5750645835_1902a86cd6_b.jpg" />
    <category term="canada" scheme="http://www.flickr.com/photos/tags/" />
    <category term="vancouver" scheme="http://www.flickr.com/photos/tags/" />
    <category term="brittishcolumbia" scheme="http://www.flickr.com/photos/tags/" />
    <category term="wordcamp" scheme="http://www.flickr.com/photos/tags/" />
    <category term="developerconference" scheme="http://www.flickr.com/photos/tags/" />
  </entry>

Prestad atención a las lineas que he marcando, porque de allí es de donde vamos a obtener la URL de la imagen y el enlace a la pagina de la imagen.

Lo que haremos sera igual que el ejemplo anterior de la lista, solo que en este caso vamos a usar un str_replace (linea 6) para reemplazar la ultima parte de la ruta de la imagen, obteniendo asi los thumbnails y no la imagen grande:

<?php
    $imagenes = simplexml_load_file('http://api.flickr.com/services/feeds/photoset.gne?set=72157603216680990&nsid=73845487@N00&lang=en-us'); //url del rss del set de Flickr
    foreach ($imagenes->entry as $imagen):
        $titulo=$imagen->title;
        $link=$imagen->link['href'];
        $imagen_url=str_replace("_b.jpg","_s.jpg",$imagen->link[1]['href']);
        echo "<a href=\"",$link,"\"><img src=\"",$imagen_url,"\" alt=\"",$titulo,"\" /></a>\n";
    endforeach;
?>

Resultado:


Conclusión

Con esta nueva función de PHP5 leer un documento XML es muchísimo menos complicado que con versiones anteriores de PHP, podemos usar esta función para obtener contenido de cualquier pagina web que tenga un canal RSS, como por ejemplo una cuenta de Twitter, etc.