SAX ( API simple para XML ) es un algoritmo en línea impulsado por eventos para analizar documentos XML , con una API desarrollada por la lista de correo XML-DEV. [1] SAX proporciona un mecanismo para leer datos de un documento XML que es una alternativa al proporcionado por el Modelo de objetos de documento (DOM). Cuando el DOM opera en el documento como un todo, construyendo el árbol de sintaxis abstracto completo de un documento XML para conveniencia del usuario, los analizadores SAX operan en cada parte del documento XML secuencialmente, emitiendo eventos de análisis sintáctico mientras hacen una sola pasada [ aclaración necesaria ] a través del flujo de entrada.
Definición
A diferencia de DOM , no existe una especificación formal para SAX. La implementación Java de SAX se considera normativa . [2] SAX procesa documentos de forma independiente del estado, en contraste con DOM que se utiliza para el procesamiento dependiente del estado de documentos XML. [3]
Beneficios
Un analizador SAX solo necesita reportar cada evento de análisis a medida que ocurre, y normalmente descarta casi toda esa información una vez reportada (sin embargo, mantiene algunas cosas, por ejemplo, una lista de todos los elementos que aún no se han cerrado, en orden para detectar errores posteriores, como etiquetas finales en el orden incorrecto). Por lo tanto, la memoria mínima requerida para un analizador SAX es proporcional a la profundidad máxima del archivo XML (es decir, del árbol XML) y la cantidad máxima de datos involucrados en un solo evento XML (como el nombre y los atributos de un solo inicio). etiqueta, o el contenido de una instrucción de procesamiento, etc.).
Esta cantidad de memoria generalmente se considera insignificante. Un analizador DOM, por el contrario, tiene que construir una representación de árbol de todo el documento en la memoria para empezar, utilizando así la memoria que aumenta con la longitud total del documento. Esto requiere mucho tiempo y espacio para documentos grandes (la asignación de memoria y la construcción de la estructura de datos toman tiempo). La ventaja compensatoria, por supuesto, es que una vez cargado , se puede acceder a cualquier parte del documento en cualquier orden.
Debido a la naturaleza impulsada por eventos de SAX, el procesamiento de documentos es generalmente mucho más rápido que los analizadores de estilo DOM, siempre que el procesamiento se pueda realizar en una pasada de principio a fin. Muchas tareas, como indexación, conversión a otros formatos, formateo muy simple y similares, se pueden realizar de esa manera. Otras tareas, como ordenar, reorganizar secciones, ir de un enlace a su destino, buscar información sobre un elemento para ayudar a procesar uno posterior y similares, requieren acceder a la estructura del documento en órdenes complejas y será mucho más rápido con DOM que con múltiples pases SAX.
Algunas implementaciones no se ajustan perfectamente a ninguna de las categorías: un enfoque DOM puede mantener sus datos persistentes en el disco, inteligentemente organizados para la velocidad (editores como SoftQuad Author / Editor y navegadores / indexadores de documentos grandes como DynaText hacen esto); mientras que un enfoque SAX puede almacenar en caché inteligentemente la información para su uso posterior (cualquier analizador SAX de validación conserva más información que la descrita anteriormente). Tales implementaciones difuminan las compensaciones DOM / SAX, pero a menudo son muy efectivas en la práctica.
Debido a la naturaleza de DOM, la lectura transmitida desde el disco requiere técnicas como evaluación diferida , cachés, memoria virtual, estructuras de datos persistentes u otras técnicas (una de estas técnicas se describe en la patente de EE.UU. 5557722). El procesamiento de documentos XML más grandes que la memoria principal a veces se considera imposible porque algunos analizadores DOM no lo permiten. Sin embargo, no es menos posible que ordenar un conjunto de datos más grande que la memoria principal usando espacio en disco como memoria para eludir esta limitación. [4]
Inconvenientes
El modelo controlado por eventos de SAX es útil para el análisis de XML, pero tiene ciertos inconvenientes.
Prácticamente cualquier tipo de validación XML requiere acceso completo al documento. El ejemplo más trivial es que un atributo declarado en la DTD como de tipo IDREF, requiere que solo haya un elemento en el documento que use el mismo valor para un atributo de ID. Para validar esto en un analizador SAX, uno debe realizar un seguimiento de todos los atributos de ID (cualquiera de ellos podría terminar siendo referenciado por un atributo IDREF al final); así como cada atributo IDREF hasta que se resuelva. De manera similar, para validar que cada elemento tiene una secuencia aceptable de elementos secundarios, la información sobre qué elementos secundarios se han visto para cada padre debe mantenerse hasta que el padre se cierre.
Además, algunos tipos de procesamiento XML simplemente requieren tener acceso a todo el documento. XSLT y XPath , por ejemplo, deben poder acceder a cualquier nodo en cualquier momento en el árbol XML analizado. Los editores y navegadores también deben poder mostrar, modificar y quizás volver a validar en cualquier momento. Si bien un analizador SAX puede usarse para construir tal árbol inicialmente, SAX no proporciona ninguna ayuda para dicho procesamiento en su conjunto.
Procesamiento XML con SAX
Un analizador que implementa SAX (es decir, un analizador SAX ) funciona como un analizador de flujo, con una API dirigida por eventos . [1] El usuario define una serie de métodos de devolución de llamada a los que se llamará cuando se produzcan eventos durante el análisis. Los eventos SAX incluyen (entre otros):
- Nodos de texto XML
- Inicio y finalización del elemento XML
- Instrucciones de procesamiento XML
- Comentarios XML
Algunos eventos corresponden a objetos XML que se devuelven fácilmente todos a la vez, como los comentarios. Sin embargo, los elementos XML pueden contener muchos otros objetos XML, por lo que SAX los representa al igual que el propio XML: por un evento al principio y otro al final. Hablando con propiedad, la interfaz SAX no se ocupa de elementos , sino de eventos que en gran parte corresponden a etiquetas . El análisis sintáctico SAX es unidireccional; Los datos analizados previamente no se pueden volver a leer sin volver a iniciar la operación de análisis.
Existen muchas implementaciones similares a SAX. En la práctica, los detalles varían, pero el modelo general es el mismo. Por ejemplo, los atributos XML se proporcionan normalmente como argumentos de nombre y valor que se pasan a eventos de elementos, pero también se pueden proporcionar como eventos separados o mediante una tabla hash o una colección similar de todos los atributos. Por otro lado, algunas implementaciones proporcionan devoluciones de llamada "Init" y "Fin" para el inicio y el final del análisis; otros no lo hacen. Los nombres exactos de los tipos de eventos dados también varían ligeramente entre implementaciones.
Ejemplo
Dado el siguiente documento XML:
xml version = "1.0" encoding = "UTF-8"?> param = "value" > & # xb6; Algunos de texto Some_pi some_attr = "some_value"?> param2 = "algo" > Pre-texto entre líneas de texto Mensaje de texto.
Este documento XML, cuando se pasa a través de un analizador SAX, generará una secuencia de eventos como la siguiente:
- Inicio del elemento XML, denominado DocumentElement , con un parámetro de atributo igual a "valor"
- Inicio del elemento XML, denominado FirstElement
- Nodo de texto XML, con datos iguales a "& # xb6; Algún texto" (nota: se pueden cambiar ciertos espacios en blanco)
- Final del elemento XML, denominado FirstElement
- Evento de instrucción de procesamiento, con el objetivo some_pi y datos some_attr = "algún_valor" (el contenido después del objetivo es solo texto; sin embargo, es muy común imitar la sintaxis de los atributos XML, como en este ejemplo)
- Inicio del elemento XML, denominado SecondElement , con un atributo param2 igual a "algo"
- Nodo de texto XML, con datos iguales a "Texto previo"
- Inicio del elemento XML, denominado Inline
- Nodo de texto XML, con datos iguales a "Texto en línea"
- Final del elemento XML, denominado Inline
- Nodo de texto XML, con datos iguales a "Post-texto".
- Final del elemento XML, denominado SecondElement
- Final del elemento XML, denominado DocumentElement
Tenga en cuenta que la primera línea del ejemplo anterior es la declaración XML y no una instrucción de procesamiento; como tal, no se informará como un evento de instrucción de procesamiento (aunque algunas implementaciones de SAX proporcionan un evento separado solo para la declaración XML).
El resultado anterior puede variar: la especificación SAX establece deliberadamente que una sección determinada de texto puede ser reportada como múltiples eventos de texto secuenciales. Muchos analizadores, por ejemplo, devuelven eventos de texto separados para referencias de caracteres numéricos. Por lo tanto, en el ejemplo anterior, un analizador SAX puede generar una serie diferente de eventos, parte de los cuales podría incluir:
- Inicio del elemento XML, denominado FirstElement
- Nodo de texto XML, con datos iguales a "& # xb6;" (el carácter Unicode U + 00b6)
- Nodo de texto XML, con datos iguales a "Algún texto"
- Final del elemento XML, denominado FirstElement
Ver también
Referencias
- ^ a b "SAXO" . webopedia.com . WEBOPEDIA . Consultado el 2 de mayo de 2011 .
Abreviatura de API simple para XML, una API basada en eventos que, como alternativa a DOM, permite que alguien acceda al contenido de un documento XML. SAX era originalmente una API solo para Java. La versión actual admite varios entornos de lenguaje de programación distintos de Java. SAX fue desarrollado por los miembros de la lista de correo XML-DEV.
- ^ "saxproject.org" .
- ^ "API simple para XML" . oracle.com . ORACLE . Consultado el 2 de mayo de 2011 .
Nota: En pocas palabras, SAX está orientado hacia el procesamiento independiente del estado, donde el manejo de un elemento no depende de los elementos que vinieron antes. StAX, por otro lado, está orientado hacia el procesamiento dependiente del estado. Para una comparación más detallada, consulte SAX y StAX en Estándares básicos y Cuándo usar SAX.
- ^ "Analizadores XML: DOM y SAX puestos a prueba" . devX . Consultado el 20 de octubre de 2011 .
Aunque estas pruebas no lo muestran, los analizadores SAX suelen ser más rápidos para documentos muy grandes donde el modelo DOM llega a la memoria virtual o consume toda la memoria disponible.
Otras lecturas
- Brownell, David (2002). SAX2 . O'Reilly. ISBN 0-596-00237-8.
- Means, W. Scott; Bodie, Michael A. (2002). El libro de SAX . Sin prensa de almidón. ISBN 1-886411-77-8.
enlaces externos
- Página de inicio de SAX