domingo, 27 de marzo de 2011

Cómo leer un fichero XML en Java y su aplicación práctica (Segunda parte)

Ejemplo práctico

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.

1 comentario: