"A diferencia del HTML, XML no se centra en la representación de la información, si no, en la información en si misma, garantiza que los datos sean independientes de aplicaciones o de fabricantes".
Con PHP podemos acceder a la información albergada en dichos documentos, nos basaremos en el siguiente XML (xml_ejemplo.xml) para los paradigmas:
(clic para mostrar/ocultar)
<?xml version="1.0" encoding="UTF-8"?> <cursos> <curso id="1"> <name>Curso A</name> <alumno dni="V-6432123"> <nombre>MarÃa</nombre> <apellido>Bolivar</apellido> <fechanac>1990-12-25</fechanac> <sexo>Femenino</sexo> </alumno> <alumno dni="V-9544321"> <nombre>José</nombre> <apellido >GarcÃa</apellido> <fechanac>1991-02-12</fechanac> <sexo>Masculino</sexo> </alumno> <alumno dni="V-15456737"> <nombre>Angelica</nombre> <apellido>Peña</apellido> <fechanac>1898-06-08</fechanac> <sexo>Femenino</sexo> </alumno> </curso> <curso id="2"> <name>Curso B</name> <alumno dni="E-81678249"> <nombre>César</nombre> <apellido>Peña</apellido> <fechanac>1994-10-17</fechanac> <sexo>Masculino</sexo> </alumno> <alumno dni="E-16429342"> <nombre>Marta</nombre> <apellido>De lucia</apellido> <fechanac>1984-01-23</fechanac> <sexo>Femenino</sexo> </alumno> </curso> <curso id="3"> <name>Curso C</name> <alumno dni="V-17695342"> <nombre>Omar</nombre> <apellido>Helguera</apellido> <fechanac>1987-08-23</fechanac> <sexo>Masculino</sexo> </alumno> <alumno dni="V-12685312"> <nombre>Kimberli</nombre> <apellido>Di' Mario</apellido> <fechanac>1991-11-24</fechanac> <sexo>Femenino</sexo> </alumno> </curso> <curso id="4"> <name>Curso D</name> <alumno dni="E-18570232"> <nombre>Inés</nombre> <apellido>Lopez</apellido> <fechanac>1992-03-30</fechanac> <sexo>Femenino</sexo> </alumno> <alumno dni="V-9345214"> <nombre>Luis</nombre> <apellido>Mesa</apellido> <fechanac>1984-07-21</fechanac> <sexo>Masculino</sexo> </alumno> </curso> </cursos>
simpleXML es una exención de PHP, fácil de usar, que nos permite parsear un XML de forma simple, convirtiéndolo en un objeto que pueda ser accedido con selectores normales y recorrido con iteraciones.
simpleXML requiere de PHP5 y libxml. Entre sus funciones mas importantes:
1.- simplexml_import_dom - obtiene un objeto SimpleXMLElement de un nodo DOM (lo contrario lo harÃamos con la función dom_import_simplexml), ejemplo:
(clic para mostrar/ocultar el código)
// creamos la instancia $XML = new DOMDocument; // cargamos los nodos $XML->loadXML (' <cursos> <curso id="1"> <name>Curso A</name> <alumno dni="V-6432123"> <nombre>MarÃa</nombre> <apellido>Bolivar</apellido> <fechanac>1990-12-25</fechanac> <sexo>Femenino</sexo> </alumno> <alumno dni="V-9544321"> <nombre>José</nombre> <apellido >GarcÃa</apellido> <fechanac>1991-02-12</fechanac> <sexo>Masculino</sexo> </alumno> </curso> </cursos> '); // mostramos un mensaje en caso de error if (!$XML) { echo 'Error analizando el documento'; exit; } // convertimos el XML en un objeto $obj = simplexml_import_dom($XML); // mostrando un elemento cualquiera echo $obj->curso[0]->alumno[0]->nombre;// devuelve maria echo '<br/><hr/>'; // podemos acceder usando iteraciones foreach ($obj->curso as $curso) { echo $curso->name,'<br/>'; foreach ($curso->alumno as $alumno) { echo $alumno->nombre,'<br/>'; echo $alumno->apellido,'<br/>'; echo $alumno->fechanac,'<br/>'; echo $alumno->sexo,'<br/>'; echo '--------------------------<br/>'; } } /* devuelve: Curso A MarÃa Bolivar 1990-12-25 Femenino -------------------------- José GarcÃa 1991-02-12 Masculino -------------------------- */
2.- simplexml_load_file - convierte un fichero XML en un objeto, ejemplo:
(clic para mostrar/ocultar)
// verificamos que exista el archivo if (!file_exists('xml_ejemplo.xml')) { echo 'El fichero no existe!';exit; } // cargamos el XML $cursos = simplexml_load_file('xml_ejemplo.xml'); // podemos acceder usando iteraciones foreach ($cursos->curso as $curso) { echo '*** <b>',$curso->name,'</b> *** <br/>'; foreach ($curso->alumno as $alumno) { echo $alumno->nombre,'<br/>'; echo $alumno->apellido,'<br/>'; echo $alumno->fechanac,'<br/>'; echo $alumno->sexo,'<br/>'; echo '--------------------------<br/>'; } } /* devuelve: *** Curso A *** MarÃa Bolivar 1990-12-25 Femenino -------------------------- José GarcÃa 1991-02-12 Masculino -------------------------- Angelica Peña 1898-06-08 Femenino -------------------------- *** Curso B *** César Peña 1994-10-17 Masculino // y el resto .. */
Resolviendo un determinado caso - tenemos varios nodos llamados curso y queremos acceder solo a uno o todos los que aparezcan luego de él, una de las soluciones puede ser la siguiente:
a.- en nuestro XML de ejemplo cada etiqueta curso tiene un identificador (id) único <curso id="x">, de esa manera podemos seleccionar que nodos mostrar, usando una condición:
(clic para mostrar/ocultar)
foreach ($cursos->curso as $curso) { // mostramos solo los nodos mayores o iguales a 3 if ($curso['id'] >= 3)// accedemos al atributo usando $objeto['atributo'] { echo '*** <b>',$curso->name,'</b> *** <br/>'; foreach ($curso->alumno as $alumno) { echo $alumno->nombre,'<br/>'; echo $alumno->apellido,'<br/>'; echo '--------------------------<br/>'; } } } /* devuelve: *** Curso C *** Omar Helguera -------------------------- Kimberli Di' Mario -------------------------- *** Curso D *** Inés Lopez -------------------------- Luis Mesa -------------------------- */
b.- accediendo solo a los nodos pares:
if ($curso['id'] % 2 == 0)
c.- accediendo a un determinado nodo:
if ($curso['id'] == 4) // nodo 4, Curso D /* devuelve: *** Curso D *** Inés Lopez -------------------------- Luis Mesa -------------------------- */
Ahora un ejemplo cargando el rss de cassianet y mostrando los titulos de las primeras cinco entradas:
(clic para mostrar/ocultar)
// cargamos el XML $rss = @simplexml_load_file('http://feeds.feedburner.com/Cassianet?format=xml'); if (!is_object($rss)) { echo 'Error en el documento XML';exit; } $i=0; foreach ($rss->entry as $entrada) { if ($i==5) break; else $i++; echo $i,' - ',$entrada->title ,'<br/>'; } /* devuelve: 1 - Funciones de filtro en PHP 2 - Kiwi! 3 - Lightbox plugin de jQuery 4 - Google Code Prettify 5 - Blogger: iconos sociales flotantes */
esta vez usamos:
$obj = @simplexml_load_string($sXML); if (!is_object($obj)) { echo 'Error en el documento XML';exit; }
El sÃmbolo @ antepuesto a la función indica que no deseamos que se muestre el error si lo hay, y para asegurarnos de que todo va bien, evaluamos si se creó el objeto antes de continuar "!is_object($obj))".
3.- simplexml_load_string retorna un objeto de tipo SimpleXMLElement a partir de una string. Si hay errores, retorna FALSE.
(clic para mostrar/ocultar)
// armamos el string $sXML = ' <cursos> <curso id="1"> <name>Curso A</name> <alumno dni="V-6432123"> <nombre>MarÃa</nombre> <apellido>Bolivar</apellido> <fechanac>1990-12-25</fechanac> <sexo>Femenino</sexo> </alumno> <alumno dni="V-9544321"> <nombre>José</nombre> <apellido >GarcÃa</apellido> <fechanac>1991-02-12</fechanac> <sexo>Masculino</sexo> </alumno> </curso> </cursos>'; // creamos el objeto $obj = @simplexml_load_string($sXML); if (!is_object($obj)) { echo 'Error en el documento XML';exit; } // mostrando un elemento cualquiera echo $obj->curso[0]->alumno[0]->nombre;// devuelve maria echo '<br/><hr/>'; // podemos acceder usando iteraciones foreach ($obj->curso as $curso) { echo $curso->name,'<br/>'; foreach ($curso->alumno as $alumno) { echo $alumno->nombre,'<br/>'; echo $alumno->apellido,'<br/>'; echo $alumno->fechanac,'<br/>'; echo $alumno->sexo,'<br/>'; echo '--------------------------<br/>'; } }
Consideraciones:
-si se nos presenta el caso de que tenemos nombre de etiquetas con guiones (ejemplo: fecha-nac), no podrÃamos acceder a su contenido usando:
echo $alumno->fecha-nac; // fecha de nacimiento
para ese caso tendrÃamos que hacerlo con llaves {} y entre comillas:
echo $alumno->{'fecha-nac'};
Son muchas las utilidades que podemos darle a esta extensión, se me ocurre por ejemplo, desarrollar un bot que cargue un RSS, los gestione y publique noticias externas (resúmenes o completas) en nuestro sitio.
Referencias:
php.net/SimpleXML
- Los comentarios están siendo moderados y serán publicados en la brevedad posible.