Lectura sencilla de XML en Java , SAX (Simple API for XML)
Vamos a ver como leer documentos XML con Sax. Sax funciona por eventos ,es decir, le pasamos el xml que tiene que leer y el ira lanzando eventos cada vez que encuentre etiquetas, propiedades, etc...
Depencendia de maven:
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>2.0.2</version>
</dependency>
Para facilitar el manejo de estos escuchadores, nos ofrece la super clase DefaultHandler, que debemos extender y sobreescribir los metodos que queremos escuchar.
Vamos a crear una clase que extienda la dicha y veremos los metodos mas importantes:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxReader extends DefaultHandler{
public void startDocument() throws SAXException {
//avisa de que empieza a leer el documento
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//avisa de que empieza a leer elemento y nos pasa la info
}
public void characters(char[] arg0, int start, int length) throws SAXException {
//nos pasa el contenido de un elemento
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
//avisa cuando acaba un elemento y nos pasa la info
}
public void endDocument() throws SAXException {
//avisa cuando acaba el documento
}
}
startDocument()-- nos avisa cuando empieza a leer el documento, por eso no pasa ningun arg
starElement() --> Encuentra una etiqueta/elemento. Argumentos:
-uri: Si has declarado namespaces para el xml, devuelve la uri del elemento , si no pues""
-localName: el nombre del elemento en el namespace , si no pues ""
-qname: el qualified name.Nombre del tag que empieza a leer. <Libros> ..en este caso devolveria un
string "libros"
-attributes: devuelve un obj Attributes, (a modo de hashmap), con los atributos de la etiqueta y su
valor . Pej: <Libro name="La colmena" avaible="true" > .
Devolveria un objeto Lista con pares
name/La colmena ;
avaible/true
characters() --> Devuelve los caracteres dentro de una etiqueta/elemento.Para pasarnos la informacion, lo que hace es que nos pasa un array de caracteres con todo el contenido del documento, pero nos pasa un puntero que indica en que caracter empieza el contenido y otro parametro que nos da la logitud.
-char[] --->Array de caracteres de todo el documento.
-start --> integer que nos indica donde empezar a leer
-length ---> logitud del texto a recoger.
Esto integra muy bien con la clase String que tiene un constructor que se adapta fantastico:
String contenido = new String(ch, start, length)
endElement()--> Avisa que acaba de leer un elemento, es decir ha encontrado etiqueta de cerrado "</" .
Los args son los mismos que para startElement, pero sin los Attribues, ya que las etiquetas
de cerrado no los admiten.
enDocument() --> Avisa de finializacion de lectura del documento.
USANDO SAX
Bueno, ya que tenemos nuestra clase manejadora que se encarga de todo el asunto, vamos a ver como crear una instancia de SaxParser , para pasarle nuestra clase manejadora y el xml que queremos leer.
1. Creamos una factoria de SaxParser , para poder crear objetos:
SAXParserFactory factory = SAXParserFactory.newInstance();
2. A dicha factoria le pedimos unobjeto de SaxParser :
SAXParser saxParser = factory.newSAXParser();
3. Al SaxParser le decimos cual es la clase que recibira las llamadas (callback de lectura) y cual es el XML a leer.
saxParser.parse(
new File("C:"+File.separator+"xml_para_leer.xml"),
new SaxReader()
);
Y fin, con eso deberia enchufarse al xml e ir soltando eventos.
Os dejo un ejemplo sencillo de salida por consola de la clase escuchadora:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxReader extends DefaultHandler {
public void startDocument() throws SAXException {
System.out.println("********************************************************************" );
System.out.println("METHOD--> startDocument().-->START READING..." );
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("------------------------START ELEMENT (<"+qName+">)---------------------------------" );
if(attributes.getLength()>0){
System.out.println("Atributos de la etiqueta :" );
for (int i=0;i<attributes.getLength();i++){
System.out.println( attributes.getQName(i)+":"+attributes.getValue(i)+" ");
}
}
}
public void characters(char[] ch,
int start,
int length) throws SAXException {
String contenido = new String(ch, start, length).trim();
if(contenido.length() > 0){
System.out.println("El valor del campo es: " + new String(ch, start, length));
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("------------------------END ELEMENT (<"+qName+">)-----------------------------------" );
}
public void endDocument() throws SAXException {
System.out.println("METHOD--> endDocument().-->END /STOP READING..." );
System.out.println("*********************************************************************" );
}
}
hola soy nuevo en esto como lo hago funcionar en mi clase, dame un ejemplo, antemano muchas gracias
ResponderEliminarUn ejempliyo hombre..
Eliminarjusto lo explico con un ejemplo:
EliminarSAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(new File("C:"+File.separator+"xml_para_leer.xml"),
new SaxReader()
);
y la clase SaxReader tambien la puedes copiar de la entrada del blog