simplexmlelement recorrer nodos leer extension crear con como atributos acceder php xml rss simplexml

leer - recorrer nodos xml php



Usando SimpleXML para leer el feed RSS (2)

Como ya sabe, SimpleXML le permite seleccionar el elemento secundario de un nodo utilizando el operador de propiedad del objeto -> o el atributo de un nodo utilizando el acceso a la matriz [''name''] . Es genial, pero la operación solo funciona si lo que seleccionas pertenece al mismo espacio de nombres .

Si desea "saltar" de un espacio de nombres a otro, puede usar los métodos children() o attributes() . En su caso, esto es un poco más complicado porque tiene <item/> en el espacio de nombres global, el nodo que está buscando está en el espacio de nombres "media" * y luego los atributos están en el espacio de nombres global nuevamente (son no prefijada.) Entonces, usando la notación normal objeto / matriz, tendrás que "saltar" dos veces:

foreach ($rss->channel->item as $item) { // we load the attributes into $thumbAttr // you can either use the namespace prefix $thumbAttr = $item->children(''media'', true)->thumbnail->attributes(); // or preferably the namespace name, read note below for an explanation $thumbAttr = $item->children(''http://search.yahoo.com/mrss/'')->thumbnail->attributes(); echo $thumbAttr[''url'']; }

*Nota

Me refiero al espacio de nombres como el espacio de nombres "multimedia", pero eso no es realmente correcto. El nombre del espacio de nombres es http://search.yahoo.com/mrss/ , y "media" es solo un prefijo, algún tipo de alias, si se quiere. Lo que es importante tener en cuenta es que http://search.yahoo.com/mrss/ es el nombre real del espacio de nombres. En algún punto, su proveedor de RSS podría decidir cambiar el prefijo a, por ejemplo, "yahoo" y su script dejará de funcionar si su script se refiere al prefijo "media". Sin embargo, si usa el nombre del espacio de nombres, seguirá funcionando sin importar el prefijo.

Estoy usando PHP y simpleXML para leer el siguiente feed rss:

http://feeds.bbci.co.uk/news/england/rss.xml

Puedo obtener la mayor parte de la información que quiero así:

$rss = simplexml_load_file(''http://feeds.bbci.co.uk/news/england/rss.xml''); echo ''<h1>''. $rss->channel->title . ''</h1>''; foreach ($rss->channel->item as $item) { echo ''<h2><a href="''. $item->link .''">'' . $item->title . "</a></h2>"; echo "<p>" . $item->pubDate . "</p>"; echo "<p>" . $item->description . "</p>"; }

Pero ¿cómo generaría la imagen en miniatura que está en la siguiente etiqueta?

<media:thumbnail width="66" height="49" url="http://news.bbcimg.co.uk/media/images/51078000/jpg/_51078953_226alanpotbury.jpg"/>


SimpleXML es bastante malo en el manejo de espacios de nombres. Tienes dos opciones: El truco más simple es simplemente leer los contenidos del feed en una cadena y reemplazar los espacios de nombres;

$feed = file_get_contents(''http://feeds.bbci.co.uk/news/england/rss.xml''); $feed = str_replace(''<media:'', ''<'', $feed); $rss = simplexml_load_string($feed); ...

Ahora puede acceder a la thumbnail del elemento directamente.

El método más elegante (no realmente) es averiguar qué URI utiliza el espacio de nombres. Si observa el código fuente de http://feeds.bbci.co.uk/news/england/rss.xml , verá que apunta a http://search.yahoo.com/mrss/ .

Ahora puede usar este URI en el método children() de un elemento SimpleXMLElement para obtener los contenidos del elemento media: thumbnail;

$rss = simplexml_load_file(''http://feeds.bbci.co.uk/news/england/rss.xml''); foreach ($rss->channel->item as $item) { $media = $item->children(''http://search.yahoo.com/mrss/''); ... }