En este aporte nos concentraremos en cómo leer un archivo XML. Usaré de ejemplo el RSS de este foro. La dirección del RSS de este foro es
http://www.forosdelweb.com/external....S2&forumids=18.
Vamos a ver dos librerías que nos ayudarán a leer el rss, estás son
SimpleXML y
DOM. El usar una o la otra va a depender de su simplicidad y/o control. SimpleXML tiene más restricciones que el DOM, pero SimpleXML es más fácil y va "directo al grano" (en ingles se dice "straitforward", no encontré una buena traducción para ese término) de lo que yo deseo ver.
Empezaremos usando la librería
SimpleXML. Para obtener la información del RSS vamos a usar la función
file_get_contents (para más información de como obtener los datos de una dirección externa puedes ver
este aporte). De esta forma es como podemos obtener la información del RSS (para poder visualizar bien la estructura sugerimos, en este caso, que vea el código fuente):
Código PHP:
Ver original<?php
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xml = new SimpleXMLElement($rss_forosdelweb);
De esa forma podemos ver la estructura y los valores que tiene cada elemento. Una de las formas, que podemos manejar la información de cada uno de los elementos, es usando el método
children.
Código PHP:
Ver original<?php
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xml = new SimpleXMLElement($rss_forosdelweb);
foreach($xml->children() as $segunda_gen){
//Para separar cada array y se pueda visualizar
foreach($segunda_gen->children() as $tercera_gen){
//Para separar cada array y se pueda visualizar
foreach($tercera_gen->children() as $cuarta_gen){
//Para separar cada array y se pueda visualizar
}
}
}
/**
* Adquirir la información con una función recursiva
* Info de función recursiva -> http://campusvirtual.unex.es/cala/epistemowikia/index.php?title=Funci%C3%B3n_recursiva
* Hace lo mismo que el ejemplo anterior
*/
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xml = new SimpleXMLElement($rss_forosdelweb);
function recursiveFunc($rss){
foreach($rss->children() as $gen){
if(count($gen->children()) > 0){ recursiveFunc($gen);
//Para separar cada array y se pueda visualizar
}
}
}
recursiveFunc($xml);
Otra forma de poder ver los datos de un elemento es indicando la ruta directamente. La forma como podemos indicar la ruta es usando (->) en vez de indicarlo como un array ($foo["bar"]). El motivo es que te estás moviendo entre objetos. Ejemplo, si yo quisiera ver solamente los datos del elemento
item
Código PHP:
Ver original<?php
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xml = new SimpleXMLElement($rss_forosdelweb);
foreach($xml->channel->item as $item){
}
Una vez ya sabemos lo que deseamos obtener, solo es necesario indicar las rutas de cada uno de los elementos que queremos. Por ejemplo, deseo mostrar el foro donde me encuentro y los datos a tomar son: el enlace del mensaje a leer, el título y la descripción.
Código PHP:
Ver original<?php
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xml = new SimpleXMLElement($rss_forosdelweb);
echo "<span style='font-weight: bold; font-size: 26px;'>" . $xml->channel->title . "</span><br /><br />";
foreach($xml->channel->item as $item){
echo "<a href='".$item->link."'>".$item->title."</a> -> " . nl2br(htmlentities($item->description, ENT_QUOTES, "UTF-8")) . "<br /><br />"; }
Para poder obtener los datos de quién fue el que creo el mensaje y el avatar, tenemos que añadir unas líneas para poder mostrar la información de el
Espacio de nombres (en ingles "namespaces"). Primero necesitamos obtener todas las direcciones de los "namespaces" y el método que nos ayudará es
getNamespaces. Este método lo que hará es ingresar en alguna variable los atributos y las direcciones que requerimos para poder leer los "namespaces". Los prefijos de los "namespaces" en este rss son
dc,
content,
media. Luego ingresamos la dirección en el método de
children. Vamos a tomar el mismo código anterior y le queremos añadir de quién fue el mensaje y el avatar.
Código PHP:
Ver original<?php
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xml = new SimpleXMLElement($rss_forosdelweb);
$getNS = $xml->getNamespaces(true);
echo "<span style='font-weight: bold; font-size: 26px;'>" . $xml->channel->title . "</span><br /><br />";
foreach($xml->channel->item as $item){
echo "<span style='color: #f00; font-weight: bold;'>" . $item->children($getNS["dc"])->creator . "</span> ";
//Verificamos que exista el nodo
if(count($item->children($getNS["media"])) > 0){ $avatar = $item->children($getNS["media"])->content;
echo "<img src='". $avatar->attributes()->url ."' alt='". $avatar->children($getNS["media"])->title ."' title='". $avatar->children($getNS["media"])->title ."' />";
}
echo " -><a href='".$item->link."'>".$item->title."</a> -> " . nl2br(htmlentities($item->description, ENT_QUOTES, "UTF-8")) . "<br /><br />"; }