Parser de Atom con JAXB

JAXB é unha tecnoloxía que proporciona unha maneira rápida de "mapear" documentos XML en obxectos Java. Dado un esquema XML (XML Schema *.xsd) que especifica a estrutura do documento XML, o compilador de JAXB (xjc) xera un conxunto de clases co código necesario para procesar, ou xerar, calquer documento XML baseado no esquema.

Para probar esta tecnoloxía propúxenme facer un parser das novas, en formato Atom de vifito.eu. JAXB vén de serie con java 6, para comprobar que podemos facer este "experimento" basta con ir a consola e probar se temos o seguinte comando xjc.

Para que o compilador de JAXB poida xerar as clases Java que mapeen un documento Atom precisamos o XML Schema da súa especificación. Como cos xsd que atopei vía google non daban máis que problemas o que fixen foi xerar o xsd a partires do xml.

Os primeiros pasos serán crear os cartafois para o noso proxecto e descargar o xml dos feeds.

$ mkdir atom-parser
$ cd atom-parser
$ wget -c http://vifito.eu/atom.xml
$ mv atom.xml data.xml

Xa temos no ficheiro data.xml o contido das novas. Para xerar o xsd a partir do xml empregaremos trang. Dende a páxina de trang descargamos o zip no apartado de "downloads", descomprimímolo e executamos o jar como se amosa a continuación:

$ wget -c http://jing-trang.googlecode.com/files/trang-20081028.zip
$ unzip trang-20081028.zip
$ cd trang-20081028
$ java -jar trang.jar ../data.xml ../atom.xsd
$ cd ..

Agora xa temos un xsd, co cal podemos executar o compilador de JAXB para xerar as clases java que nos mapearán calquer xml que siga devandito schema.

$ xjc -verbose -d . -p eu.vifito.atom atom.xsd

É posible que o compilador dé un erro dicindo que non atopa o schema xml.xsd. Nese caso descargarémolo no mesmo directorio e volveremos executar o compilador:

$ wget -c http://www.w3.org/2001/03/xml.xsd
$ xjc -verbose -d . -p eu.vifito.atom atom.xsd

Os ficheiros xerados polo compilador son os seguintes:

`-- eu
`-- vifito
`-- atom
|-- Author.class
|-- Author.java
|-- Content.class
|-- Content.java
|-- Entry.class
|-- Entry.java
|-- Feed.class
|-- Feed.java
|-- Generator.class
|-- Generator.java
|-- Link.class
|-- Link.java
|-- ObjectFactory.class
|-- ObjectFactory.java
|-- Subtitle.class
|-- Subtitle.java
|-- Summary.class
|-- Summary.java
|-- Title.class
|-- Title.java
|-- package-info.class
`-- package-info.java

Agora implementaremos unha clase java (eu.vifito.atom.impl.AtomParser, eu/vifito/atom/impl/AtomParser.java) que empregue o API JAXB para parsear unha URL que lle proporcionaremos como parámetro por liña de comandos:

 package eu.vifito.atom.impl;
 
import java.io.File;
import java.net.URL;
import java.net.MalformedURLException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
 
import eu.vifito.atom.*;
 
public class AtomParser {
    public static void main(String[] args)
        throws MalformedURLException, JAXBException {
        String atomUrl = null;    
 
        if(args.length>0) {
            atomUrl = args[0];
        } else {
            System.out.println("Proporciona un URI a un feed Atom.");
            System.out.println("java eu.vifito.atom.impl.AtomParser \"http://vifito.eu/atom.xml\"");
            System.exit(0);
        }
 
        JAXBContext context = JAXBContext.newInstance("eu.vifito.atom");
        Unmarshaller unmarshaller = context.createUnmarshaller();
 
 
        URL url = new URL(atomUrl);
        Feed feeds = (Feed) unmarshaller.unmarshal(url);
 
        for(Entry entry : feeds.getEntry()) {
            System.out.println( "Titulo: " + entry.getTitle());
        }
 
    }
}

Compilamos o todo o código:

$ javac eu/vifito/atom/*.java
$ javac eu/vifito/atom/impl/AtomParser.java

Agora xa podemos executar o noso programa que parsea feeds Atom (ollo! as comiñas no parámetro da URL para evitar que se execute como tarefa de fondo por mor do carácter &):

$ java eu.vifito.atom.impl.AtomParser "http://vifito.eu/atom.xml"
Titulo: Alternativa aos reprodutores de vídeo flash, javafx.scene.media.MediaPlayer
Titulo: JavaFx, a escolla de Vancouver 2010
Titulo: GalipediaBox, Usando o API da Galipedia
Titulo: Javascript closures
Titulo: Vimperator
Titulo: Actualizado: Rescatando FirefoxFalaGalego, agora empregando Google Tradutor
Titulo: ZFDebug, unha toolbar para desenvolver con Zend Framework
Titulo: Os meus addons de Firefox
Titulo: Optimizar as táboas dunha base de datos con Database Transversal API
Titulo: Workshop WCAG 2.0
Titulo: A W3C lanza o seu novo sitio
Titulo: bestwebframeworks
Titulo: GalDic, proxecto do CDWA
Titulo: Integración de Gears PubTools en Joomla!
Titulo: svn commit -m "NautilusSVN, o TortoiseSVN para gnome"

Descargar o código fonte

O próximo obxectivo é implementar un servlet que lea feeds e que os poidamos incorporar a nosa web. Para calquera dúbida podes enviarme un email a: vifito[arroba]vifito[punto]eu

Referencias:

Última actualización 2012-08-16
2:33 AM (Europe/Madrid)
Data de creación 2009-12-28
12:50 PM (Europe/Madrid)
Parser Atom Feeds with JAXB API
java xml