Los ficheros XML de noticias (RSS) existentes en la web tienen todos una misma estructura:
Para nosotros los nodos de interés son:
- item: contiene una noticia y por tanto todos sus elementos.
- title: contiene el titular de la noticia.
- link: contiene un enlace a la página donde se encuentra la noticia.
- description: contiene una breve descripción de la noticia.
- autor: contiene el autor de la noticia.
- pubDate: contiene la fecha de publicación de la noticia.
Vamos a diseñar una pequeña aplicación que obtenga las noticias contenidas en un fichero RSS de un determinado diario en Internet.
Primero crearemos una clase que se ajuste a la estructura de la noticia: Noticia.java.
public class Noticia {
private String titulo;
private String enlace;
private String descripcion;
private String autor;
private String fecha;
public Noticia(String titulo, String enlace, String descripcion,
String autor, String fecha) {
this.titulo = titulo;
this.enlace = enlace;
this.descripcion = descripcion;
this.autor = autor;
this.fecha = fecha;
}
//…
// Getters y Setters
}
La siguiente clase será la que se encargue de parsear el fichero de noticias (fichero XML recibido de Internet) y devolverá una lista de las noticias leídas: LectorRSS.java.
public class LectorRSS {
public static ArrayList LeerRSS(String uri) {
String titulo = "";
String enlace = "";
String descripcion = "";
String autor = "";
String fecha = "";
ArrayList Noticias = new ArrayList();
// 1. Obtenemos una instacia de DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
// 2. Obtenemos un DocumentBuilder que internamente usará un parser con el
// comportamiento deseado (en nuestro caso el comportamiento por defecto)
DocumentBuilder builder = factory.newDocumentBuilder();
// 3. Cargamos un documento a través del DocumentBuilder por medio de la URI
// del fichero (lo cargamos desde un sitio determinado de Internet)
Document document = builder.parse(uri);
// 4. Obtenemos una lista de noticias (las noticias son los nodos etiquetados
// como item)
NodeList items = document.getElementsByTagName("item");
// 5. Por cada noticia, extraemos los diferentes elementos que la componen
for (int i = 0; i < items.getLength(); i++) {
Node nodo = items.item(i);
for (Node n = nodo.getFirstChild(); n != null; n = n
.getNextSibling()) {
if (n.getNodeName() == "title")
titulo = n.getTextContent();
if (n.getNodeName() == "link")
enlace = n.getTextContent();
if (n.getNodeName() == "description") {
descripcion = n.getTextContent();
// Para eliminar tags HTML
descripcion = descripcion.replaceAll("<[^>]*>", "");
}
if (n.getNodeName() == "author")
autor = n.getTextContent();
if (n.getNodeName() == "pubDate") {
fecha = n.getTextContent();
}
}
// 6. Creamos un objeto noticias con los datos obtenidos y lo añadimos a
// la lista
Noticia noticia = new Noticia(titulo, enlace, descripcion, autor, fecha);
Noticias.add(noticia);
}
} catch (ParserConfigurationException e) {
System.err.println("No se pudo crear una instancia de DocumentBuilder");
} catch (SAXException e) {
System.err.println("Error SAX al parsear el archivo");
} catch (IOException e) {
System.err.println("Se produjo un error de E/S");
} catch (DOMException e) {
System.err.println("Se produjo un error del DOM");
}
return Noticias;
}
}
La última de las clases será la aplicación principal, qué mostrará de una determinada forma los datos extraídos del fichero XML: Lanzador.java.
public class Lanzador {
public static void main(String[] args) {
//Deportes --> http://www.as.com/rss.html
//Nacional --> http://www.elpais.com/rss/feed.html?feedId=1002
//Internancional --> http://www.elpais.com/rss/feed.html?feedId=1001
//Economía --> http://www.expansion.com/rss/portada.xml
//Salud --> http://noticias.interbusca.com/rss/salud.xml
//Ciencia y tecnología --> http://www.publico.es/estaticos/rss/ciencias
//Cultura --> http://www.publico.es/estaticos/rss/culturas
ArrayList noticias = LectorRSS.LeerRSS("http://www.elpais.com/rss/feed.html?feedId=1002");
for (Iterator iter = noticias.iterator(); iter.hasNext();) {
Noticia noticia = iter.next();
System.out.println(noticia.getTitulo());
System.out.println(noticia.getEnlace());
System.out.println(noticia.getDescripcion());
System.out.println("========================================================");
}
}
}
Como vemos, en esta aplicación solo mostramos el título, el enlace y la descripción de la noticia.
Esta entrada me ha venido de maravilla. gracias!
ResponderEliminar