Parseando XML con Java (II)

Seguimos con el post de ayer, donde estábamos implementando en Java una aplicación que leyese un documento XML usando SAX. La aplicación de ejemplo la he dividido en 5 clases: Index, Acciones, Parseador, Interfaz y Conclusión.

  • Parseador: Es la clase que se encarga de leer el documento XML. Esta clase contiene varios métodos por defecto: inicioElemento(Avisa que se ha encontrado una etiqueta registro, y de paso almacenamos el atributo definido en ella), finElemento (Tratamos los datos, en nuestro caso almacenamos en el objeto Vector) y characters (recibe la ubicación de los caracteres del elemento y los extraemos almacenándolos en una cadena). En realidad inicioElemento y finalElemento son una versión simplificada de los métodos startElement y endElement. De aquí sacaremos una colección con los datos que hayamos leído durante el proceso de lectura. En la variable valor se irá guardando una cadena que contiene los datos extraídos, es decir, los datos que tendremos que almacenar en la colección. El código es el siguiente:

    
    import org.xml.sax.helpers.DefaultHandler;
    import org.xml.sax.Attributes;
    import java.util.Vector;
    import org.xml.sax.;
    import org.xml.sax.helpers.;
    
    public class Parseador extends DefaultHandler  {
      private Vector coleccion; 
      private Acciones actual; 
      private String valor; 
    
      public Parseador (Vector coleccion) {
         this.coleccion = coleccion; 
      }
    
      /*
      localName: contiene el nombre de la etiqueta.
      att: de la clase "org.xml.sax.Attributes",
      es una tabla que contiene los atributos
      contenidos en la etiqueta.
      */
      public void startElement( String namespaceURI,
               String localName, String qName,
               Attributes attr ) throws SAXException {
                
         inicioElemento(localName, attr);
      }
    
      public void endElement (String namespaceURI,
               String localName, String rawName)
               throws SAXException {
          finElemento(localName);
      }
    
       public void inicioElemento(String nombreElemento,
                Attributes atributo) throws SAXException {
                
          if (nombreElemento.equals("entrada")) {
            actual = new Acciones (); 
            coleccion.addElement(actual); 
            actual.setID(
                 Integer.parseInt(atributo.getValue("id"))); 
          }
        }
    
        public void finElemento(String nombreElemento)
                 throws SAXException {
    
            if (nombreElemento.equals("nombre")){ 
              actual.setNombre (valor);
            } else if (nombreElemento.equals("telefono")) {
              actual.setTelefono (Integer.parseInt(valor)); 
            }
        }
    
        public void characters (char[] ch, int start, int end)
        {
     
           valor = new String (ch, start, end);
           valor = valor.trim();
        }
    }
    

  • Acciones: La clase Acciones contiene sencillos métodos get y set utilizando en la aplicación. Viene dada por el siguiente código:

    
    public class Acciones {
         
       private String documento;
       private String nombre;
       private int telefono;
       private int id;
    
       public void setNombre (String nombre) {
          this.nombre = nombre;
       }
    
       public void setTelefono (int telefono) {
          this.telefono = telefono;
       }
    
       public void setID (int id) {
          this.id = id;
       }
    
       public void setDocumento(String documento) {
          this.documento = documento;
       }
    
        public String getNombre() {
           return nombre;
        }
    
        public int getTelefono()  {
           return telefono;
        }
    
         public int getID() {
           return id;
         }
    
         public String getDocumento() {
           return documento;
         }
    }
    

  • Index: Es la clase que contiene el main e invoca a las demás clases. Su código es el que se muestra a continuación:

    
    import java.util.Vector;
    import org.xml.sax.XMLReader;
    import org.xml.sax.SAXException;
    import org.apache.xerces.parsers.SAXParser;
    import org.xml.sax.*;
    
    public class Index {
         
      Vector coleccion = new Vector ();
      Acciones acciones = new Acciones ();
      XMLReader parser = new SAXParser();
    
     public void ParsearDocumento () throws Exception {
    
          String nombre_de_archivo;
          acciones.setDocumento("index.xml"); 
          nombre_de_archivo=acciones.getDocumento(); 
          parser.setContentHandler(new Parseador(coleccion));
          parser.parse(nombre_de_archivo); 
          Interfaz contenedor = new Interfaz(coleccion);
     }
    
     public static void main(String[] args) throws Exception {
    
          Index ejecutar = new Index();
          ejecutar.ParsearDocumento();
     }
    
    }
    

  • Interfaz y Conclusión: La clase Interfaz es la que se encarga de crear la interfaz gráfica dónde se mostrarán los datos en pantalla. La clase Conclusión es una clase auxiliar de Interfaz.

    
    import java.util.Vector;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.List;
    import java.awt.MenuBar;
    import java.awt.Menu;
    import java.awt.MenuItem;
    import java.awt.Event;
    import java.awt.*;
    import java.awt.image.ImageObserver;
    
    public class Interfaz {
    
       public Interfaz(Vector datos) {
    
          int i;
          Acciones[] inserta=new Acciones[datos.size()]; 
          List miLista = new List(15,false);
    
          for(i=0;i
    
    
    import java.awt.*;
    import java.awt.event.*;
    
    public class Conclusion extends WindowAdapter {
        public void windowClosing( WindowEvent evt ) {
             System.exit(0);
        }
    }
    

Referencias | Wikipedia.org Referencias | Xerces

Portada de Xataka Ciencia