Cómo analizar archivos XML
1) DOM (analizador JAXP Crimson)
DOM es el estándar oficial del W3C para representar documentos XML de manera independiente de la plataforma y el idioma. Esta jerarquía permite a los desarrolladores encontrar
información específica en el árbol. Analizar esta estructura generalmente requiere cargar todo el documento y construir la jerarquía antes de poder realizar cualquier trabajo. Debido a que el DOM se basa en una jerarquía de información, se puede considerar como una estructura basada en árboles o en objetos. Primero, debido a que el árbol es persistente en la memoria, se puede modificar para que las aplicaciones puedan realizar cambios en los datos y la estructura. Además, puede navegar hacia arriba y hacia abajo por el árbol en cualquier momento, en lugar de simplemente procesarlo una vez como SAX.
2) SAX
Las ventajas del procesamiento SAX son muy similares al procesamiento en streaming. El análisis puede comenzar inmediatamente sin tener que esperar a que se procesen todos los datos. Y, debido a que la aplicación solo verifica los datos cuando se leen, no es necesario almacenarlos en la memoria. Esta es una gran ventaja para documentos grandes. De hecho, la aplicación ni siquiera necesita analizar el documento completo; puede dejar de analizarlo cuando se cumplen ciertas condiciones. En general, SAX también es mucho más rápido que su alternativa, DOM.
¿DOM o SAX? Para los desarrolladores que necesitan escribir su propio código para procesar documentos XML, elegir un modelo de análisis DOM o SAX es una decisión de diseño importante. DOM accede a documentos XML mediante la construcción de una estructura de árbol, mientras que SAX utiliza un modelo de eventos.
Un analizador DOM convierte un documento XML en un árbol que contiene su contenido y puede ser recorrido. La ventaja de utilizar un modelo de análisis DOM es que es fácil de programar; los desarrolladores simplemente llaman al comando de construcción del árbol y luego usan la API de navegación para acceder a los nodos del árbol necesarios para completar la tarea. Los elementos del árbol se pueden agregar y modificar fácilmente. Sin embargo, debido a que es necesario procesar todo el documento XML cuando se utiliza el analizador DOM
, los requisitos de rendimiento y memoria son altos, especialmente cuando se encuentran archivos XML muy grandes. Debido a que los analizadores DOM tienen capacidades transversales, a menudo se usan en servicios que requieren cambios frecuentes en documentos XML.
El analizador SAX utiliza un modelo basado en eventos para desencadenar una serie de eventos al analizar un documento XML. Cuando se encuentra una etiqueta determinada, puede activar un método de devolución de llamada para indicarle al método que
ha sido Buscar el marcado especificado. SAX generalmente consume menos memoria porque permite al desarrollador decidir qué etiquetas procesar. Esta escalabilidad de SAX se agradece especialmente cuando los desarrolladores sólo necesitan trabajar con parte de los datos
contenidos en el documento. Sin embargo, codificar con un analizador SAX puede resultar difícil y puede resultar complicado acceder a varios fragmentos de datos diferentes en el mismo documento al mismo tiempo.
3) JDOM /
Aunque DOM4J es un desarrollo completamente independiente, originalmente era una bifurcación inteligente de JDOM. Integra muchas características más allá de la representación básica de documentos XML, incluida la compatibilidad con XPath integrada, la compatibilidad con esquemas XML y el procesamiento basado en eventos para documentos grandes o en streaming. También proporciona la opción de acceder a la representación del documento en paralelo a través de la API DOM4J y la interfaz DOM estándar. Ha estado en desarrollo desde finales de 2000.
Para admitir todas estas características, DOM4J utiliza interfaces y métodos de clase base abstractos. DOM4J hace un uso intensivo de clases de colección en su API, pero en muchos casos también proporciona alternativas para un mejor rendimiento o métodos de codificación más directos. El beneficio directo de DOM4J es que, aunque su API es más compleja, proporciona mayor flexibilidad que JDOM.
Con los objetivos de mayor flexibilidad, integración XPath y manejo de documentos grandes, DOM4J tiene los mismos objetivos que JDOM: facilidad de uso y operación intuitiva por parte de los desarrolladores de Java.
Además, se esfuerza por ser
una solución más completa que JDOM, logrando el objetivo de manejar fundamentalmente todos los problemas de Java/XML. Para lograr este objetivo, pone menos énfasis que JDOM en prevenir el comportamiento incorrecto de las aplicaciones.
DOM4J es una API Java XML muy, muy excelente
, que es de alto rendimiento, potente y fácil de usar, y también es un software de código abierto. Ahora, puedes ver cada vez más software Java que usa DOM4J para leer y escribir XML. En particular, incluso JAXM de Sun usa DOM4J.
2. Comparación
1) DOM4J tiene el mejor rendimiento, incluso JAXM de Sun usa DOM4J. Actualmente, muchos proyectos de código abierto utilizan ampliamente DOM4J. Por ejemplo, el famoso Hibernate también utiliza DOM4J para leer archivos de configuración XML.
2) JDOM y DOM tuvieron un rendimiento deficiente en las pruebas de rendimiento y la memoria se desbordó al probar 10 millones de documentos. Aunque los desarrolladores de JDOM han declarado
que quieren centrarse en los problemas de rendimiento antes del lanzamiento oficial, realmente no hay nada que recomiende JDOM desde una perspectiva de rendimiento. Además, DOM sigue siendo una muy buena opción y las implementaciones de DOM se utilizan ampliamente en varios lenguajes de programación
. También es la base de muchos otros estándares relacionados con XML y, dado que el W3C lo recomienda oficialmente (en lugar de basarse en el modelo Java basado en estándares), algunos tipos de proyectos también pueden requerirlo (por ejemplo, en
Usando el DOM en JavaScript).
3) SAX funciona mejor, dependiendo de su método de análisis específico basado en eventos. SAX detecta el flujo XML entrante pero no lo carga en la memoria (por supuesto, partes del documento se ocultan temporalmente en la memoria mientras se lee el flujo XML).
3. Uso básico de cuatro operaciones xml
[java] Ver copia pura
archivo xml:
1) DOM
importar java.io.*
< p; >importar java.util.*;importar org.w3c.dom.*
importar javax.xml.
clase pública MyXMLReader{
importar javax.xml.
p>
public static void main(String arge[]){
larga duración =System.currentTimeMillis(); p>
de larga duración =System.currentTimeMillis();
p>
de larga duración =System.currentTimeMillis()
de larga duración =System.currentTimeMillis(); .
prueba{
Archivo f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
DocumentBuilderFactory.newInstance()newDocumentBuilder()
Documento doc = builder.parse(f); p> NodeList nl = doc.getElementsByTagName ("VALOR");
for (int i=0;ipublic void caracteres(char ch[], int start, int length) lanza SAXException {
Etiqueta de cadena = (Cadena) etiquetas.peek();
if (tag.equals(" NO")) {
System.out.print("Matrícula número: " + nueva cadena (canal, inicio, longitud));
}
if (tag.equals(" NO")) {
Sistema .out.print("Número de matrícula: " + new String(ch, start, length)
}
if (tag.equals("ADDR")){
System.out.println("Dirección:" + nueva cadena (canal, inicio, longitud);
}+
new String(ch, inicio, longitud));
}
if (tag.equals("ADDR")
}
}
public void startElement(String uri,String localName,String qName,Atributos atributos) {
tags.push(qName);}
etiquetas. push(qName);}
}
3) JDOM
importar java.io.*
importar java.util. *;
importar org.jdom.*;
clase pública MyXMLReader {
public static void main(String arge[]) {
larga duración = System.build(new File("data_10k.xml"));
Elemento foo = doc.getRootElement()
Lista todos los niños = foo.getChildren( );
for(int i=0;i4) DOM4J
importar java.io.*
importar java.util.*; >
importar org.dom4j.*;
importar org.dom4j.io.*;
clase pública MyXMLReader {
público vacío estático ( String arge[]) {
larga duración = System.currentTimeMillis()
prueba {
Archivo f = nuevo Archivo("data_10k.xml") ;
Lector SAXReader = nuevo SAXReader();
Documento doc = lector.read(f);
Elemento raíz = doc.getRootElement (); /p>
Elemento foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext();){
foo = (Elemento) i.next();
System.+ foo.elementText("ADDR"));
}
}
} captura (Excepción e) {
e.printStackTrace()
}
}
}