1. Dom (Jaxp Crimson Parser)
DOM es el estándar W3C oficial para representar documentos XML de una manera independiente de la plataforma y el idioma. DOM es una colección de nodos o fragmentos de información organizados en una jerarquía. Esta jerarquía permite a los desarrolladores buscar información específica en el árbol. Analizar esta estructura generalmente requiere cargar todo el documento y construir la jerarquía antes de que se pueda hacer cualquier trabajo. Dado que se basa en el nivel de información, el DOM se considera basado en árboles o basado en objetos. DOM y el procesamiento generalizado basado en árboles tienen varias ventajas. Primero, dado que el árbol es persistente en la memoria, se puede modificar para que la aplicación pueda hacer cambios en los datos y la estructura. También le permite navegar por el árbol en cualquier momento, en lugar de ser un trabajo único como SAX. DOM es mucho más simple de usar.
2. Sax
Las ventajas del procesamiento de SAX son muy similares a las ventajas de la transmisión. El análisis puede comenzar de inmediato, en lugar de esperar a que se procesen todos los datos. Y, dado que la aplicación solo verifica los datos al leerlos, no necesita almacenar los datos en la memoria. Esta es una gran ventaja para documentos grandes. De hecho, la aplicación ni siquiera tiene que analizar todo el documento; Puede dejar de analizar cuando se cumple una determinada condición. En términos generales, Sax es mucho más rápido que su reemplazo de DOM.
Elige 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 muy importante. DOM utiliza el método para establecer una estructura de árbol para acceder a los documentos XML, mientras que SAX usa el modelo de evento.
El analizador DOM convierte un documento XML en un árbol que contiene su contenido y puede atravesar el árbol. La ventaja de analizar un modelo con DOM es que es fácil de programar. Los desarrolladores solo necesitan llamadas instrucciones para hacer árboles y luego usar las API de navegación para acceder a los nodos de árbol requeridos para completar la tarea. Es fácil de agregar y modificar elementos en el árbol. Sin embargo, dado que todo el documento XML debe procesarse cuando se usa el analizador DOM, los requisitos de rendimiento y memoria son relativamente altos, especialmente cuando se encuentran grandes archivos XML. Debido a sus capacidades transversales, los analizadores DOM a menudo se usan en servicios donde los documentos XML requieren cambios frecuentes.
El analizador de saxo adopta un modelo basado en eventos. Puede activar 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 decirle al método que se ha encontrado la etiqueta. El SAX generalmente requiere baja memoria porque permite a los desarrolladores decidir las etiquetas que desean procesar. Especialmente cuando los desarrolladores solo necesitan procesar parte de los datos contenidos en el documento, la capacidad de expansión de SAX se refleja mejor. Sin embargo, la codificación es difícil al usar el analizador SAX, y es difícil acceder a múltiples datos diferentes en el mismo documento al mismo tiempo.
3. JDom http://www.jdom.org
El propósito de JDOM es ser un modelo de documento específico de Java, que simplifica la interacción con XML y es más rápido que usar DOM. Dado que es el primer modelo específico de Java, JDOM ha sido promovido y promovido enérgicamente. Considerando terminar utilizándolo como una "extensión estándar de Java" a través de "solicitud de especificación Java JSR-102". El desarrollo de JDOM se ha iniciado desde principios de 2000.
JDOM y DOM son principalmente diferentes en dos aspectos. Primero, JDOM solo usa clases concretas y no interfaces. Esto simplifica la API de alguna manera, pero también limita la flexibilidad. En segundo lugar, la API utiliza una gran cantidad de clases de colecciones, que simplifica el uso de desarrolladores de Java que ya están familiarizados con estas clases.
La documentación de JDOM establece que su propósito es "usar 20% (o menos) de esfuerzo para resolver problemas de Java/XML del 80% (o más)" (asumido como 20% basado en la curva de aprendizaje). Por supuesto, JDOM es útil para la mayoría de las aplicaciones Java/XML, y la mayoría de los desarrolladores encuentran que las API son mucho más fáciles de entender que DOM. JDOM también incluye controles bastante extensos sobre el comportamiento del programa para evitar que los usuarios hagan nada sin sentido en XML. Sin embargo, todavía requiere que comprenda completamente XML para hacer algo más allá de lo básico (o incluso comprender los errores en algunos casos). Este puede ser un trabajo más significativo que aprender una interfaz DOM o JDOM.
Jdom en sí no contiene un analizador. Por lo general, utiliza un analizador SAX2 para analizar y validar los documentos XML de entrada (aunque también puede tomar representaciones DOM previamente construidas como entrada). Contiene algunos convertidores para emitir representaciones JDOM en transmisiones de eventos Sax2, modelos DOM o documentos de texto XML. JDOM es de código abierto lanzado bajo la variante de licencia Apache.
4. DOM4J http://dom4j.sourceforge.net
Aunque DOM4J representa un resultado de desarrollo completamente independiente, inicialmente fue una rama inteligente de JDOM. Incorpora muchas características más allá de las representaciones básicas de documentos XML, que incluyen soporte integrado de XPath, soporte de esquema XML y procesamiento basado en eventos para documentos grandes o transmitidos. También proporciona la opción de crear una representación de documentos, que tiene acceso paralelo a través de la API DOM4J y la interfaz DOM estándar. Ha estado en desarrollo desde la segunda mitad de 2000.
Para admitir todas estas características, DOM4J utiliza interfaces y métodos de clase base abstracta. DOM4J utiliza ampliamente la clase de colecciones en la API, pero en muchos casos también proporciona algunas alternativas para permitir un mejor rendimiento o un método de codificación más directo. El beneficio directo es que, si bien DOM4J paga el precio de una API más compleja, proporciona una flexibilidad mucho mayor que JDOM.
Al agregar flexibilidad, la integración de XPath y los objetivos del gran procesamiento de documentos, DOM4J es lo mismo que JDOM: facilidad de uso y operación intuitiva para los desarrolladores de Java. También se compromete a convertirse en una solución más completa que JDOM, logrando el objetivo de lidiar con todos los problemas de Java/XML en la naturaleza. Al completar este objetivo, enfatiza menos énfasis en prevenir un comportamiento de aplicación incorrecto que JDOM.
DOM4J es una API Java XML muy, muy excelente, con un rendimiento excelente, funciones potentes y extremadamente fácil de usar. También es un software de código abierto. Hoy en día, puede ver que más y más software Java está utilizando DOM4J para leer y escribir XML. Vale la pena mencionar particularmente que incluso el JAXM de Sun está usando DOM4J.
Comparación de los cuatro métodos
DOM4J tiene el mejor rendimiento, e incluso Jaxm de Sun usa DOM4J. Actualmente, muchos proyectos de código abierto usan DOM4J en grandes cantidades, como el famoso Hibernate también usa DOM4J para leer archivos de configuración XML. Si no se considera la portabilidad, entonces se usa DOM4J.
JDOM y DOM funcionan mal durante las pruebas de rendimiento, la memoria se desborda al probar los documentos de 10 m. También vale la pena considerar DOM y JDOM en el caso de una pequeña documentación. Si bien los desarrolladores de JDOM han declarado que esperan centrarse en los problemas de rendimiento antes del lanzamiento oficial, desde el punto de vista de rendimiento, realmente no lo recomienda. Además, DOM sigue siendo una muy buena opción. La implementación DOM se usa ampliamente en una variedad de lenguajes de programación. También es la base de muchos otros estándares relacionados con XML, ya que son recomendaciones oficialmente W3C (a diferencia de los modelos Java no basados en el estándar), por lo que también puede ser necesaria en algunos tipos de proyectos (como usar DOM en JavaScript).
El SAX funciona mejor, que depende de su método de análisis específico: impulsado por eventos. Un saxo detecta una próxima transmisión XML, pero no se carga en la memoria (por supuesto, cuando se lea la secuencia XML, algunos documentos se ocultarán temporalmente en la memoria).
Uso básico de cuatro métodos de operación XML
Archivo XML:
<?xml version="1.0" encoding="GB2312"?><RESULT><VALUE> <NO>A1234</NO> <ADDR> No. XX Section XX Road, XX Town, XX County, Sichuan Province </ADDR></VALUE><VALUE> <NO> <ADDR> Group XX Village, XX Township, XX City, Sichuan Province </dadr> </valor> </resultado >
1) Método de implementación de DOM
import java.io.*; import java.util.*; importar org.w3c.dom.*; import javax.xml.parsers.*; clase pública myxmlReader {public static void main (string arge []) {long Lasting = System.CurrentTimemillis (); intente {archivo f = nuevo archivo ("data_10k.xml"); DocumentBuilderFactory factory = documentBuilderFactory.NewinStance (); DocumentBuilder Builder = factory.newDocumentBuilder (); Documento doc = Builder.Parse (f); Nodelist nl = doc.getElementsBytagName ("valor"); for (int i = 0; i < nl.getLength (); i ++) {system.out.print ("número de placa:"+doc.getElementsBytagName ("no"). item (i) .getFirstChild (). getNodeValue ()); System.out.println ("Dirección del propietario:" + Doc.getElementsBytagName ("addr"). Item (i) .getFirstChild (). GetNodeValue ()); }} Catch (Exception e) {E.PrintStackTrace ();} 2) Método de implementación de SAX
importar org.xml.sax.*; importar org.xml.sax.helpers.*; import javax.xml.parsers.*; clase pública myxmlreader extiende defaulthandler {java.util.stack etiquetas = new java.util.stack (); public myxmlReader () {super ();} public static void main (string args []) {largo duradero = system.currentTimemillis (); intente {saxParserFactory sf = saxParserFactory.newinStance (); Saxparser sp = sf.newsaxparser (); MyXMLReader Reader = new MyXMLReader (); Sp.Parse (nuevo EntrySource ("data_10k.xml"), lector); } catch (Exception e) {E.PrintStackTrace (); } System.out.println ("Time de ejecución:" + (System.CurrentTimemillis () - Durado) + "MilliseConds");} public void caracteres (char ch [], int inicio, int longitud) arroja saxexception {string tag = (string) tags.peek (); if (tag.equals ("no")) {system.out.print ("número de matrícula:" + nueva cadena (ch, inicio, longitud));} if (tag.equals ("addr")) {system.out.println ("dirección:" + nueva cadena (ch, inicio, longitud);}} public void startElement (string uri, string localname, string qname, atributs atributs) { Tags.push (qname);}} 3) Método de implementación de JDOM
import java.io.*; import java.util.*; importar org.jdom.*; importar org.jdom.input.*; clase public myxmlReader {public static void main (string arge []) {larga duración = system.currentTimemillis (); Pruebe {SaxBuilder Builder = new SaxBuilder (); Documento doc = Builder.Build (nuevo archivo ("data_10k.xml")); Elemento foo = doc.getRootElement (); List AllChildren = foo.getChildren (); for (int i = 0; i < allChildren.size (); i ++) {System.out.print ("Número de placa:"+((elemento) AllChildren.get (i)). GetChild ("No"). GetText ()); System.out.println ("Dirección del propietario:" + ((elemento) AllChildren.get (i)). GetChild ("addr"). GetText ()); }} catch (Exception e) {E.PrintStackTrace ();}} 4) Método de implementación DOM4J
import java.io.*; import java.util.*; import org.dom4j.*; importar org.dom4j.io.*; clase public myxmlReader {public static void main (string arge []) {larga duración = system.currentTimemillis (); intente {archivo f = nuevo archivo ("data_10k.xml"); Saxreader lector = new saxreader (); Documento doc = lector.read (f); Elemento root = doc.getRootElement (); Elemento foo; para (iterator i = root.ElementIterator ("value"); i.hasnext () {foo = (element) I.Next (); System.out.print ("Número de matrícula:" + foo.elementText ("no")); System.out.println ("Dirección del propietario:" + foo.EmementText ("addr"));}} E.PrintStackTrace ();})