En Java, hay dos formas de analizar documentos XML de forma nativa, a saber: análisis Dom y análisis Sax.
La función de análisis Dom es poderosa y se puede agregar, eliminar, modificar y verificar durante la operación, el documento xml se leerá en la memoria en forma de un objeto de documento, por lo que es adecuado para documentos pequeños.
El análisis Sax lee el contenido línea por línea y elemento por elemento de principio a fin. Es más inconveniente de modificar, pero es adecuado para documentos grandes de solo lectura.
Este artículo explica principalmente el análisis de Sax y el resto se publicará más adelante.
Sax utiliza un enfoque basado en eventos para analizar documentos. En pocas palabras, es como ver una película en el cine. Puedes verla de principio a fin sin retroceder (Dom puede leerla de un lado a otro).
En el proceso de ver una película, cada vez que te encuentres con una trama, un desgarro o un encuentro hombro con hombro, movilizarás tu cerebro y tus nervios para recibir o procesar esta información.
De manera similar, durante el proceso de análisis de Sax, leer el principio y el final del documento y el principio y el final del elemento activarán algunos métodos de devolución de llamada. Puede realizar el procesamiento de eventos correspondiente en estos métodos de devolución de llamada.
Los cuatro métodos son: startDocument(), endDocument(), startElement(), endElement
Además, no es suficiente leer el nodo. También necesitamos el método caracteres () para procesar cuidadosamente el contenido del elemento.
Al reunir estos métodos de devolución de llamada, se forma una clase, que es el disparador que necesitamos.
Generalmente, el documento se lee desde el método principal, pero el documento se procesa en el activador. Este es el llamado método de análisis basado en eventos.
Como se muestra arriba, en el activador, primero comienza a leer el documento y luego comienza a analizar los elementos uno por uno. El contenido de cada elemento se devolverá al método caracteres ().
Luego finalice la lectura del elemento. Una vez leídos todos los elementos, finalice el análisis del documento.
Ahora comenzamos a crear la clase desencadenante. Para crear esta clase, primero debemos heredar DefaultHandler.
Cree SaxHandler y anule el método correspondiente:
la clase pública SaxHandler extiende DefaultHandler {
/* Este método tiene tres parámetros
arg0 es la matriz de caracteres devuelta, que contiene el contenido del elemento
arg1 y arg2 son las posiciones inicial y final de la matriz respectivamente*/
@Anular
caracteres públicos vacíos (char[] arg0, int arg1, int arg2) lanza SAXException {
Contenido de la cadena = nueva cadena (arg0, arg1, arg2);
System.out.println(contenido);
super.caracteres(arg0, arg1, arg2);
}
@Anular
endDocument public void() lanza SAXException {
System.out.println("/n...Finalizar documento de análisis...");
super.endDocument();
}
/* arg0 es el espacio de nombres
arg1 es la etiqueta que contiene el espacio de nombres, o está vacía si no hay ningún espacio de nombres
arg2 es una etiqueta sin espacio de nombres*/
@Anular
elemento final vacío público (cadena arg0, cadena arg1, cadena arg2)
lanza SAXException {
System.out.println("Fin del elemento de análisis" + arg2);
super.endElement(arg0, arg1, arg2);
}
@Anular
startDocument public void() lanza SAXException {
System.out.println("…………Comience a analizar el documento………/n");
super.startDocument();
}
/*arg0 es el espacio de nombres
arg1 es la etiqueta que contiene el espacio de nombres, o está vacía si no hay ningún espacio de nombres
arg2 es la etiqueta sin espacio de nombres
arg3 es obviamente una colección de atributos*/
@Anular
elemento de inicio vacío público (cadena arg0, cadena arg1, cadena arg2,
Atributos arg3) lanza SAXException {
System.out.println("Iniciar análisis de elementos" + arg2);
si (arg3! = nulo) {
para (int i = 0; i < arg3.getLength(); i++) {
// getQName() es para obtener el nombre del atributo,
System.out.print(arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(arg2 + ":");
super.startElement(arg0, arg1, arg2, arg3);
}
}
importar javax.xml.parsers.SAXParser;
importar javax.xml.parsers.SAXParserFactory;
demostración de prueba de clase pública {
public static void main (String [] args) lanza una excepción {
// 1. Crear una instancia del objeto SAXParserFactory
Fábrica SAXParserFactory = SAXParserFactory.newInstance();
// 2. Crea un analizador
Analizador SAXParser = factory.newSAXParser();
// 3. Obtenga el documento que necesita ser analizado, genere un analizador y finalmente analice el documento
Archivo f = nuevo Archivo("libros.xml");
SaxHandler dh = nuevo SaxHandler();
analizador.parse(f, dh);
}
}
Comience a analizar los libros de elementos.
libros:
Comience a analizar el libro de elementos.
id="001"libro:
Comience a analizar el título del elemento.
título:Harry Potter
Título del elemento de análisis final
Comience a analizar el autor del elemento.
autor:J K. Rowling
Autor del elemento de análisis final
Libro de elementos de análisis final
Comience a analizar el libro de elementos.
id="002"libro:
Comience a analizar el título del elemento.
título:Aprendiendo XML
Título del elemento de análisis final
Comience a analizar el autor del elemento.
autor:Erik T. Ray
Autor del elemento de análisis final
Libro de elementos de análisis final
Finalizar libros de elementos de análisis
…………Finalizar documento de análisis…………
Para ejecutar este proceso con mayor claridad, también podemos reescribir SaxHandler para restaurar el documento xml original.
Clase SaxHandler anulada:
la clase pública SaxHandler extiende DefaultHandler {
@Anular
caracteres públicos vacíos (char[] arg0, int arg1, int arg2) lanza SAXException {
System.out.print(new String(arg0, arg1, arg2));
super.caracteres(arg0, arg1, arg2);
}
@Anular
endDocument public void() lanza SAXException {
System.out.println("/n finaliza el análisis");
super.endDocument();
}
@Anular
elemento final vacío público (cadena arg0, cadena arg1, cadena arg2)
lanza SAXException {
System.out.print("</");
System.out.print(arg2);
System.out.print(">");
super.endElement(arg0, arg1, arg2);
}
@Anular
startDocument public void() lanza SAXException {
System.out.println("Iniciar análisis");
String s = "<?xml version=/"1.0/" codificación=/"UTF-8/"?>";
System.out.println(s);
super.startDocument();
}
@Anular
elemento de inicio vacío público (cadena arg0, cadena arg1, cadena arg2,
Atributos arg3) lanza SAXException {
System.out.print("<");
System.out.print(arg2);
si (arg3! = nulo) {
para (int i = 0; i < arg3.getLength(); i++) {
System.out.print(" " + arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(">");
super.startElement(arg0, arg1, arg2, arg3);
}
}
Se ve mucho mejor ahora y restaurarlo ilustra mejor su proceso de análisis.