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.