Parsear XML usando Java Stax Event

Parsear documento con información meteorológica en formato XML con Java usando Stax Event

En mi último post realicé un parseo de XML usando Java Stax Cursor, en esta ocasión voy a realizar el mismo ejemplo pero usando Java Stax Event. Sabiendo bien cómo está estructurado el XML, marcamos los pasos para obtener la temperatura máxima y la fecha del día en cuestión son:

  1. Instanciar día llegando a tagDia
  2. Añadir día mediante dentro de tagDia usando atrDia
  3. Añadir temperatura máxima mediante path: /root/prediccion/dia/temperatura/maxima
  4. Añadir POJO a lista días mediante tagDia

Necesitaremos entonces las siguientes variables:

String path = "";
String pathTemMax = "/root/prediccion/dia/temperatura/maxima";
String tagDia = "dia";
String atrDia = "fecha";

El código completo está comentado, y es el siguiente:

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String fileName;
        fileName = "src/inventadoAemet/localidad_41091.xml";
        List<Pojo> dias = parseXML(fileName);
        List<Pojo> diasFiltrados = filtroTMax(dias, 20.0);
        
        System.out.println(dias);
        System.out.println(diasFiltrados);
    }
        
    private static List<Pojo> parseXML(String fileName) {
        List<Pojo> dias = new LinkedList<Pojo>();
        Pojo dia = null;
        
        //Localizar elementos
        String path         = "";
        String pathTemMax   = "/root/prediccion/dia/temperatura/maxima";
        String tagDia           = "dia";
        String atrDia           = "fecha";
        
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        try {
            InputStream in  = new FileInputStream(fileName);
            XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(in);
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                
                if (event.isStartElement()) {
                    StartElement startElement = event.asStartElement();
                    path = path +"/"+ startElement.getName().getLocalPart();

                    if (startElement.getName().getLocalPart().equalsIgnoreCase(tagDia)) {
                        //Instanciar dia
                        dia = new Pojo();
                        
                        //Añadir dia usando atrDia
                        Iterator<Attribute> atributos = startElement.getAttributes();
                        while (atributos.hasNext()) {
                            Attribute atributo = atributos.next();
                            if (atributo.getName().toString().equalsIgnoreCase(atrDia)) {
                                dia.setDia(atributo.getValue());
                            }
                        }
                    }
                    //Añadir temperatura máxima mediante path: /root/prediccion/dia/temperatura/maxima
                    if (event.isStartElement()) {
                        event = eventReader.nextEvent();
                        if (path.equalsIgnoreCase(pathTemMax)) {
                            System.out.println("traza");
                            dia.setTemperatura(Integer.parseInt(event.asCharacters().getData()));
                        }
                    }
                }
                
                if (event.isEndElement()) {
                    EndElement endElement = event.asEndElement();
                    
                    //Añadir POJO a lista días mediante tagDia
                    if (endElement.getName().getLocalPart().equalsIgnoreCase(tagDia))
                        dias.add(dia);

                    //Actualizar PATH 
                    path = path.substring(0,path.lastIndexOf("/"));
                }
            }
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XMLStreamException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return dias;
    }

    /**
     * Devuelve una lista de objetos Días (Pojo) en los que la temperatura
     * temperatura máxima sea mayor a la indicada por parámetro
     * @param dias      Lista de todos los días que contiene el XML
     * @param limite        Temperatura a partir de la que se desea filtrar
     * @return          Lista de días que complen condición de temperatura
     *                  máxima mayor a la indicada
     */
    public static List<Pojo> filtroTMax(List<Pojo> dias, double limite){
        List<Pojo> filtroTempMax = new LinkedList<Pojo>();

        for (Pojo pojo : dias) {
            if (pojo.getTemperatura() > limite)
                filtroTempMax.add(pojo);
        }
        return filtroTempMax;
    }
}

Cómo se puede ver hay método para realizar el filtro de temperaturas List<Pojo> filtroTMax(List<Pojo> dias, double limite).

No he incluido el fichero XML, puede verse en el enlace al otro que post que publiqué sobre parseo de XML usando Java Stax Cursor

El vídeo completo:

Enlace de descarga del código Parsear XML con Stax Event