java - ¿Por qué sax analizar más rápido que el análisis de dom? y ¿cómo funciona el stax?
xml (4)
El análisis de DOM requiere que cargue todo el documento en la memoria y luego recorra un árbol para encontrar la información que desea.
SAX solo requiere tanta memoria como necesite para IO básico, y puede extraer la información que necesita a medida que se lee el documento. Debido a que SAX está orientado a flujo, incluso puede procesar un archivo que todavía está siendo escrito por otro proceso.
algo relacionado con: libxml2 de java
sí, esta pregunta es bastante larga, lo siento. Lo guardé es tan denso como me pareció posible. Resumí las preguntas para que fuera más fácil echar un vistazo antes de leer todo el asunto.
¿Por qué sax analizar más rápido que el análisis dom? Lo único que se me ocurre es que, con sax, probablemente ignoras la mayoría de los datos entrantes y, por lo tanto, no desperdicias tiempo procesando partes del xml que no te importan. IOW: después de analizar w / SAX, no puede volver a crear la entrada original. Si escribiste tu analizador SAX para que contabilizara todos y cada uno de los nodos xml (y pudieras así recrear el original), entonces no sería más rápido que DOM lo haría?
La razón por la que estoy preguntando es que estoy tratando de analizar documentos XML más rápidamente. Necesito tener acceso a todo el árbol xml DESPUÉS de analizar. Estoy escribiendo una plataforma para que los servicios de terceros se conecten, por lo que no puedo anticipar qué partes del documento xml se necesitarán y qué partes no. Ni siquiera sé la estructura del documento entrante. Es por eso que no puedo usar jaxb o sax. La huella de memoria no es un problema para mí porque los documentos xml son pequeños y solo necesito 1 en memoria a la vez. Es el tiempo que se tarda en analizar este documento xml relativamente pequeño que me está matando. No he usado el stax anteriormente, pero quizás necesito investigar más a fondo porque podría ser el punto medio. Si entiendo correctamente, stax conserva la estructura xml original y procesa las partes que solicito según demanda. De esta forma, el tiempo de análisis original puede ser rápido, pero cada vez que le pido que atraviese una parte del árbol aún no se ha cruzado, ¿es entonces cuando se lleva a cabo el procesamiento?
Si proporciona un enlace que responda la mayoría de las preguntas, aceptaré su respuesta (no es necesario que conteste directamente mis preguntas si ya las ha respondido en otro lugar).
actualización: lo reescribí en saxofón y analiza documentos en promedio 2,1 ms. Esta es una mejora (16% más rápida) en comparación con los 2.5 ms que dom estaba tomando, sin embargo, no es la magnitud que I (et al) hubiera adivinado
Gracias
SAX es más rápido porque los analizadores DOM a menudo usan un analizador SAX para analizar un documento internamente, luego hacen el trabajo extra de crear y manipular objetos para representar cada nodo, incluso si la aplicación no se preocupa por ellos.
Es probable que una aplicación que usa SAX directamente utilice el conjunto de información de manera más eficiente que un "analizador sintáctico" de DOM.
StAX es un medio feliz donde una aplicación obtiene una API más conveniente que el enfoque basado en eventos de SAX, pero no sufre la ineficiencia de crear un DOM completo.
SAX es más rápido que DOM (generalmente cuando se lee un documento XML grande) porque SAX le proporciona información como una secuencia de eventos (generalmente se accede a través de un controlador) mientras DOM crea nodos y administra la estructura de creación de nodos hasta que se crea un árbol DOM (como representado en el documento XML).
Para archivos relativamente pequeños, no sentirá el efecto (excepto que posiblemente ese proceso adicional sea realizado por DOM para crear el elemento Node y / o las listas de Nodo).
Realmente no puedo comentar sobre StAX ya que nunca he jugado con él.
Suponiendo que no hace más que analizar el documento, la clasificación de los diferentes estándares del analizador es la siguiente:
1. StAX es el más rápido
- El evento es reportado a ti
2. SAX es el siguiente
- Hace todo lo que hace StAX más el contenido se realiza automáticamente (nombre del elemento, espacio de nombres, atributos, ...)
3. DOM es el último
- Hace todo lo que hace SAX y presenta la información como una instancia de Node.
Su caso de uso
- Si necesita mantener todo el XML, DOM es la representación estándar. Se integra de forma limpia con las transformaciones XSLT (javax.xml.transform ), XPath ( javax.xml.xpath ) y las validaciones de esquema ( javax.xml.validation ). Sin embargo, si el rendimiento es clave, puede ser capaz de construir su propia estructura de árbol usando StAX más rápido que un analizador DOM podría construir un DOM.