giovedì 25 marzo 2010

Impariamo ad usare XStream

Le API di XStream (http://xstream.codehaus.org/) risolvono egregiamente il tipico problema di prendere in carico un flusso XML per poterlo utilizzare all'interno della nostra applicazione.
Andiamo a sviscerare un esempio che mi sono trovato a gestire per manipolare un flusso RSS recuperato dalla consolle web di ActiveMQ (http://activemq.apache.org/).
Il feed RSS in ingresso era così strutturato:

rss
  channel
    title
    link
    description
    items
      item
        title
        link
        description
        pubDate
        guid
        dc:date
      /item
..
      item
        title
        link
        description
        pubDate
        guid
        dc:date

      /item


    /items
  /channel
/rss

Questo particolare flusso xml è stato reso disponibile all'interno della mia Web Application Java con queste semplici righe di configurazione dell'oggetto XStream:

XStream xstream = new XStream();
xstream.alias("rss",AMQ5RssFeed.class);
xstream.alias("channel",AMQ5RssChannel.class);
xstream.alias("item",AMQ5RssItem.class);
xstream.addImplicitCollection(AMQ5RssChannel.class,"items");
xstream.aliasField("dc:date",AMQ5RssItem.class,"dcDate");

Le ultime due righe sono particolarmente interessanti perchè mi permettono di escludere il tag "items" che sostanzialmente ha il solo scopo di contenere gli item (con addImplicitCollection) e assegno un alias per convertire lo strano tag "dc:date" utilizzando uno standard java-like (con aliasField).

Infine ecco il dettaglio delle mie 3 classi pojo contenitore:

public class AMQ5RssFeed {
   
    public AMQ5RssChannel channel;

    public AMQ5RssChannel getChannel() {
        return channel;
    }
    public void setChannel(AMQ5RssChannel channel) {
        this.channel = channel;
    }

}

public class AMQ5RssChannel {
   
    public String title, link, description;
    public List items;
   
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getLink() {
        return link;
    }
    public void setLink(String link) {
        this.link = link;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public List getItems() {
        return items;
    }
    public void addItem(AMQ5RssItem item) {
        this.items.add(item);
    }
}

public class AMQ5RssItem {
   
    public String title, link, description, pubDate, guid, dcDate;

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getLink() {
        return link;
    }
    public void setLink(String link) {
        this.link = link;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getPubDate() {
        return pubDate;
    }
    public void setPubDate(String pubDate) {
        this.pubDate = pubDate;
    }
    public String getGuid() {
        return guid;
    }
    public void setGuid(String guid) {
        this.guid = guid;
    }
    public String getDcDate() {
        return dcDate;
    }
    public void setDcDate(String dcDate) {
        this.dcDate = dcDate;
    }
}

Direi che è tutto!

Alla prossima.

Nessun commento:

Posta un commento