martedì 8 ottobre 2013

Come leggere un file XML in Java

Molto spesso capita di interfacciarsi con applicazioni tramite XML, oppure usufruire delle API di un servizio web che esportano i propri dati su dei file XML. Ebbene, in questo post spiegherò come leggere un file XML da Java, supponendo che il file XML sia una risorsa web, in particolare questa: 


che è un file che ci dà informazioni su una traccia musicale (Believe di Cher). Per semplicità, supponiamo che a noi interessa sapere la durata di questo brano e la risorsa immagine che è la cover dell'album a cui appartiene. Innanzitutto, per leggere un file XML l'applicazione che si propone di farlo deve conoscere come è strutturato questo file, specifico per ogni servizio. Per esempio, questo file di last.fm ha come root element il tag <lfm status="ok"> che ci dice che il servizio di last.fm attualmente funziona. Tralasciando altre descrizioni del file XML, arriviamo a quello che ci interessa: la durata del brano si trova in <track>--><duration>mentre l'immagine dell'album si trova in <album>--><image>Nota che ci sono quattro varianti del tag <image> che si differenziano per il valore del parametro "size". Supponiamo a noi interessa una dimensione media quindi scegliamo il valore "medium" del suddetto parametro. Passiamo allora al codice. 

Innanzitutto ci serve una libreria; io uso e mi trovo bene con jdom (www.jdom.org). 
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

public class prova {
    public static void main(String[] args) {
        try {
            SAXBuilder builder = new SAXBuilder();
            Document document= builder.build("http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=91de4539bbb0d5b2bdc36d23d3906246&artist=cher&track=believe");
            Element duration = document.getRootElement().getChild("track").getChild("duration");
            System.out.printf("La durata è: "+duration.getValue());
            java.util.List albumImage = document.getRootElement().getChild("track").getChild("album").getChildren("image");
            String albumImageResource = "";
            java.util.Iterator iteratore = albumImage.iterator();
            while (iteratore.hasNext()){
                Element elemento = (Element)iteratore.next();
                if (elemento.getAttributeValue("size").equals("medium")) {
                    albumImageResource = elemento.getValue();
                    break;
                }                  
            }
            System.out.printf("\nLa risorsa della cover dell'album è: "+albumImageResource);
        }
        catch (org.jdom.JDOMException e) {
            System.out.printf(e.toString());
        }
        catch (java.io.IOException e) {
            System.out.printf(e.toString());
        }
    }
    
}
Come vedete il tutto è molto intuitivo, è possibile infatti per ogni tag ottenere un valore, un sottotag in particolare, o una lista di sottotag, o ancora la lista completa; e per ogni tag ottenere anche i parametri e il valore di ciascun parametro.

Nessun commento:

Posta un commento