2008-10-30 18 views
118

Actualmente estoy usando Magpie RSS, pero a veces se cae cuando el feed RSS o Atom no está bien formado. ¿Hay alguna otra opción para analizar feeds RSS y Atom con PHP?La mejor manera de analizar feeds RSS/Atom con PHP

+1

Hay un problema con esta solicitud la mayoría de los lectores de Feed están utilizando los lectores de núcleo XML de php y si el XML no está Bien Formateado como lo requieren los estándares XML, caerá sobre él podría mirar los que no usan lectores XML y usar un Text Reader sin embargo la carga en el servidor aumentará drásticamente. Sé que esto está respondido Estoy haciendo que las personas sean conscientes de los inconvenientes del uso de lectores de fuentes XML –

+1

Nunca intente analizar XML no válido. Culpa a la fuente. – Lothar

Respuesta

28

Sus otras opciones incluyen:

+4

Zend Feed http://framework.zend.com/manual/en/zend.feed.html – artur

+173

No me gustan tales "respuestas", dando enlaces sin ningún comentario. Parece googlearlo y vincularlo con algunos resultados principales. Especialmente porque el asker tiene algo de experiencia en RSS y necesita un analizador * mejor *. –

+3

En caso de que alguien necesite un consejo, Último RSS es el más fácil de los tres mencionados anteriormente. Solo necesita 1 archivo para "requerir", y puede obtener el RSS dentro de 5 líneas, con una salida de matriz decente. – Raptor

2

utilizo SimplePie a analizar un canal lector de Google y funciona muy bien y tiene un conjunto de características decente .

Por supuesto, no lo he probado con feeds RSS/Atom no bien formados, así que no sé cómo lo hace, supongo que los de Google son bastante compatibles con los estándares. :)

6

La biblioteca HTML Tidy es capaz de corregir algunos archivos XML con formato incorrecto. Ejecutar sus feeds a través de eso antes de pasarlos al analizador puede ayudar.

151

Siempre he usado the SimpleXML functions built in to PHP para analizar documentos XML. Es uno de los pocos analizadores genéricos que tiene una estructura intuitiva, lo que hace que sea extremadamente fácil crear una clase significativa para algo específico como un feed RSS. Además, detectará advertencias y errores XML, y al encontrar cualquiera, simplemente podría ejecutar la fuente a través de algo como HTML Tidy (como lo mencionó ceejayoz) para limpiarlo e intentarlo de nuevo.

considerar esta clase muy áspero, simple usando SimpleXML:

class BlogPost 
{ 
    var $date; 
    var $ts; 
    var $link; 

    var $title; 
    var $text; 
} 

class BlogFeed 
{ 
    var $posts = array(); 

    function __construct($file_or_url) 
    { 
     $file_or_url = $this->resolveFile($file_or_url); 
     if (!($x = simplexml_load_file($file_or_url))) 
      return; 

     foreach ($x->channel->item as $item) 
     { 
      $post = new BlogPost(); 
      $post->date = (string) $item->pubDate; 
      $post->ts = strtotime($item->pubDate); 
      $post->link = (string) $item->link; 
      $post->title = (string) $item->title; 
      $post->text = (string) $item->description; 

      // Create summary as a shortened body and remove images, 
      // extraneous line breaks, etc. 
      $post->summary = $this->summarizeText($post->text); 

      $this->posts[] = $post; 
     } 
    } 

    private function resolveFile($file_or_url) { 
     if (!preg_match('|^https?:|', $file_or_url)) 
      $feed_uri = $_SERVER['DOCUMENT_ROOT'] .'/shared/xml/'. $file_or_url; 
     else 
      $feed_uri = $file_or_url; 

     return $feed_uri; 
    } 

    private function summarizeText($summary) { 
     $summary = strip_tags($summary); 

     // Truncate summary line to 100 characters 
     $max_len = 100; 
     if (strlen($summary) > $max_len) 
      $summary = substr($summary, 0, $max_len) . '...'; 

     return $summary; 
    } 
} 
+2

tiene una etiqueta final sin etiqueta de inicio. ;) –

+116

Bueno, tenía uno, pero estaba siendo comido por el formateador de código de SO ya que no tenía una línea vacía encima. En una nota relacionada, no comenzaste tu oración con una letra mayúscula. ;) –

+4

Por favor, cambie '$ feed_uri = $ feed_or_url;' a '$ feed_uri = $ file_or_url;' ... además de eso, ¡gracias por este código! ¡Funciona genial! – Tim

12

Si el alimento no se XML bien formado, que se supone que rechazarla, sin excepciones. Tiene derecho a llamar al creador de feeds a bozo.

De lo contrario, estamos allanando el camino al desastre que terminó en HTML.

+3

+1, no debería intentar trabajar con ningún XML que no esté bien formado. Hemos tenido malas experiencias con ellos, créanme, fue un gran dolor :( –

+33

Sin embargo, los programadores no pueden elegir socios comerciales y tienen que analizar lo que se les ofrece. –

+2

¿Qué sucede si está creando un RSS/Atom universal? lector de fuentes? Si algún archivo xml mal formado puede "ensuciar" tu HTML, ¿quién es el Bozo?;) sé liberal en lo que recibes. – yPhil

1

Personalmente uso de piensos BNC avanzada parser- me gusta el sistema de plantillas que es muy fácil de usar

32

Con 4 líneas, importar un rss a una matriz.

$feed = implode(file('http://yourdomains.com/feed.rss')); 
$xml = simplexml_load_string($feed); 
$json = json_encode($xml); 
$array = json_decode($json,TRUE); 

Para una solución más compleja

$feed = new DOMDocument(); 
$feed->load('file.rss'); 
$json = array(); 
$json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue; 
$json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue; 
$json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue; 
$items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item'); 

$json['item'] = array(); 
$i = 0; 

foreach($items as $key => $item) { 
$title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue; 
$description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue; 
$pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue; 
$guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue; 

$json['item'][$key]['title'] = $title; 
$json['item'][$key]['description'] = $description; 
$json['item'][$key]['pubdate'] = $pubDate; 
$json['item'][$key]['guid'] = $guid; 
} 

echo json_encode($json); 
+2

Acabo de intentarlo. No da una matriz – samayo

+0

¿me puede dar la alimentación rss que está utilizando? – PJunior

+2

En caso de que te lo estés preguntando. Parece que está usando un feed rss tumblr. Anytumblrsite.com/rss le daría el mismo resultado. – andrewk

-1

Otra gran analizador libre - http://bncscripts.com/free-php-rss-parser/ Es muy ligero (sólo 3 kb) y fácil de usar!

+0

no puede decirse que es "excelente" usando gzinflate y base64_decode, generalmente deshabilitado por razones de seguridad. –

15

me gustaría introducir script sencillo para analizar RSS:

$i = 0; // counter 
$url = "http://www.banki.ru/xml/news.rss"; // url to parse 
$rss = simplexml_load_file($url); // XML parser 

// RSS items loop 

print '<h2><img style="vertical-align: middle;" src="'.$rss->channel->image->url.'" /> '.$rss->channel->title.'</h2>'; // channel title + img with src 

foreach($rss->channel->item as $item) { 
if ($i < 10) { // parse only 10 items 
    print '<a href="'.$item->link.'">'.$item->title.'</a><br />'; 
} 

$i++; 
} 
Cuestiones relacionadas