| « Los metales no huelen | Portada | El sistema de conducción cardíaco » |
27 octubre 2006
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<datos .size();i++) { inserta[i]=(Acciones)datos.elementAt(i); miLista.add(inserta[i].getID()+"." <ins>inserta[i].getNombre()</ins> " - "+inserta[i].getTelefono()); } Frame miFrame = new Frame("Agenda Electrónica XML"); miFrame.setLayout(new FlowLayout()); miFrame.add(miLista); miFrame.setSize(200,275); miFrame.setVisible(true); miFrame.addWindowListener(new Conclusion()); } }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
Más noticias sobre:
Programación
Tags: java, programación, xml
Comentarios (1)
| Trackback
Comentarios
Excelente, muy interesante y ahora estaba estudiando la forma de hacer un lector de feeds rss en java. En http://www.uatsap.com detallan la estructura del xml usado para rss. Bien bien….
#1 | emu | 28 oct 2006 04:06:57
Noticias relacionadas
14 diciembre 2007 | El Test de Turing y el día a día
16 agosto 2007 | El primer servidor integrado en chip
19 julio 2007 | Software para conocer la felicidad de las personas
19 abril 2007 | ¿Qué hace un bioinformático?
31 enero 2007 | Nuevo cemento que reduce la emisión de CO2 y mejora las prestaciones del cemento tradicional






