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.
Dumas dice
Muchas gracias por el tuto, estuve buscando uno con este tema hace ya tiempo. Voy a ponerlo en practica.
Camilo dice
Muy buena info, desde hace un tiempo que la guardo en favoritos. La verdad tengo una duda, por casualidad ¿sabes guardar una variable xml en una variable json?
De antemano agradezco tu ayuda.
Saludos,
Camilo
Anonadado dice
Me estoy quedando anonado con la calidad de los post relacionados con la la temática PHP + MySQL.
No lo podrían hacer mejor.
Post cortos, con ejemplo fácilmente comprensibles y todo el código bien comentado e identado.
Están tocando y resolviendo todas las situaciones con las que cualquier desarrollador web DUMMIES.
Bravo, bravo y bravo.
Además desarrollan ejemplos de la vida real y no por partes inconexas sino resolviendo un problema contemplando todos los casos de uso desde el principio a fin.
Dejando un código totalmente funcional y reutilizable para múltiples proyectos.
Espectaculaculares entradas las de https://tursos.com.
Felicidades, de lo mejorcito de la Web en ayuda al webmaster con dotes de programador, diseñador, etc.
Edwind Pineda dice
Muchas Gracias, si nosotros somos un equipo de personas que estamos dispuestos a colaborar y ayudar a los demás, todo lo que nosotros aprendemos día a día lo compartimos con la comunidad, la idea es saber compartir las cosas y no ser codicioso con el conocimiento.
Es un gusto para mi saber que muchas personas están aprendiendo de nuestro blog que no es aun muy popular y queremos que la información llegue a todas las personas que la necesiten.
Me despido de usted y disfrute todo el contenido que tiene WebTursos.
luis dice
que version en joomla me recomiendas .. y donde consigo plugins para modulos
Josue Ochoa dice
No uso Joomla, te recomiendo usar WordPress 🙂
php dice
hola! tengo una duda: cuando el xml proviene de un web service es diferente tiene otras etiquetas y me he liado, me sale perfecto cuando dentro de «NewdataSet» devuelve una sola tabla pero cuando devuelve más hago un foreach pero no me funciona, ¿cual sería la navegación entre etiquetas para acceder a un campo de la 2ª tabla por ej?, es algo asi el xml:
…
ENTREGADO
AAAAA
4
…
…
Alejandro dice
muy bueno el post, pero tengo este problema; tengo este xml que proviene de un web service:
-79.68048580339 22.243187879343 -75.37384517839
21.012719129343 -75.54962642839 23.693383191843 -73.87970455339
24.923851941843 -79.68048580339 22.243187879343
no puedo acceder a los datos que tengo, en este caso quiero acceder a posList que es la etiqueta que tiene el valor que me interesa, he tratado de mil maneras pero nada, le agradeceria si pudiera ayudarme en este tema.
santiago r.a dice
Está genial, muy bien explicado, muchas gracias por compartirlo.
JuanMa Barreda Fafasuli dice
Gracias, me sirvió mucho. Mi web: http://www.vidayobradefafa.com.ar
Marcos Delgado dice
No dejaste lo mas importante que es como leer esta linea 73845487@N00