API simple para XML
SAX (API simple para XML) es un algoritmo en línea basado en eventos para leer y analizar documentos XML, con una API desarrollada por la lista de correo XML-DEV. SAX proporciona un mecanismo para leer datos de un documento XML que es una alternativa a la proporcionada por el modelo de objeto de documento (DOM). Donde el DOM opera en el documento como un todo, creando el árbol de sintaxis abstracta completo de un documento XML para comodidad del usuario, los analizadores SAX operan en cada parte del documento XML secuencialmente, emitiendo eventos de análisis mientras realizan un solo paso a través de la entrada. corriente.
Definición
A diferencia de DOM, no existe una especificación formal para SAX. La implementación Java de SAX se considera normativa. SAX procesa documentos de forma independiente al estado, en contraste con DOM, que se utiliza para el procesamiento de documentos XML en función del estado.
Beneficios
Un analizador SAX solo necesita informar cada evento de análisis a medida que ocurre, y normalmente descarta casi toda esa información una vez informada (sin embargo, conserva algunas cosas, por ejemplo, una lista de todos los elementos que aún no se han cerrado)., 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í una memoria que aumenta con la longitud total del documento. Esto toma 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 de SAX basada en eventos, el procesamiento de documentos es generalmente mucho más rápido que los analizadores de estilo DOM, siempre que el procesamiento se pueda realizar de principio a fin. Muchas tareas, como la indexación, la conversión a otros formatos, el formateo muy simple y similares, se pueden realizar de esa manera. Otras tareas, como clasificar, reorganizar secciones, pasar 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 complejos y serán mucho más rápidos con DOM que con varios pases de SAX.
Algunas implementaciones no se ajustan perfectamente a ninguna categoría: un enfoque DOM puede mantener sus datos persistentes en el disco, inteligentemente organizados para mayor velocidad (editores como SoftQuad Author/Editor y navegadores/indexadores de documentos grandes como DynaText hacen esto); mientras que un enfoque SAX puede almacenar información en caché de manera inteligente para su uso posterior (cualquier analizador SAX de validación conserva más información que la descrita anteriormente). Tales implementaciones desdibujan 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 esas 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 clasificar un conjunto de datos más grande que la memoria principal utilizando el espacio en disco como memoria para eludir esta limitación.
Inconvenientes
El modelo basado en eventos de SAX es útil para el análisis de XML, pero tiene ciertas desventajas.
Prácticamente cualquier tipo de validación XML requiere acceso al documento en su totalidad. El ejemplo más trivial es que un atributo declarado en la DTD como de tipo IDREF requiere que haya un solo elemento en el documento que use el mismo valor para un atributo ID. Para validar esto en un analizador SAX, se 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 tenga una secuencia aceptable de elementos secundarios, la información sobre qué elementos secundarios se han visto para cada elemento principal debe conservarse hasta que se cierre el elemento principal.
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 bien puede usarse para construir un árbol de este tipo inicialmente, SAX no proporciona 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 basada en eventos. El usuario define una serie de métodos de devolución de llamada que se llamarán cuando ocurran eventos durante el análisis. Los eventos SAX incluyen (entre otros):
- XML Nodos de texto
- Elemento XML comienza y termina
- 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 como lo hace el mismo 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 corresponden en gran medida a etiquetas. El análisis SAX es unidireccional; los datos analizados previamente no se pueden volver a leer sin iniciar de nuevo 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 normalmente se proporcionan como argumentos de nombre y valor que se pasan a los eventos del elemento, 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 "Init" y "Aleta" devoluciones de llamada para el comienzo y el final del análisis; otros no. Los nombres exactos de los tipos de eventos dados también varían ligeramente entre las implementaciones.
Ejemplo
Dado el siguiente documento XML:
¿Según la versión xml="1.0" encoding="UTF-8"? Elemento param="valor"■ " Primer elemento " "#xb6; Algún texto
Identificado/Primer Elemento ¿A veces? SecondElement param2="algo"■Pre-Text " Inline "Texto inlineado■/Inline Post-texto.
" SecondElement ratio "Identificado/DocumentoElement relativo
Este documento XML, cuando se pasa a través de un analizador SAX, generará una secuencia de eventos como la siguiente:
- XML Element start, named Documento Elemento, con un atributo param igual a "valor"
- XML Element start, named FirstElement
- XML Nodo de texto, con datos equivalentes a "cl#xb6; texto" (nota: ciertos espacios blancos pueden ser cambiados)
- XML Element end, named FirstElement
- Proceso de Instrucción evento, con el objetivo algunos_pi y datos algunos_attr="some_value" (el contenido después del objetivo es sólo texto; sin embargo, es muy común imitar la sintaxis de los atributos XML, como en este ejemplo)
- XML Element start, named SecondElement, con un atributo param2 igual a "algo"
- XML Nodo de texto, con datos iguales a "Pre-Text"
- XML Element start, named Inline
- XML Nodo de texto, con datos iguales a "texto inlineado"
- XML Element end, named Inline
- XML Nodo de texto, con datos iguales a "Post-text".
- XML Element end, named SecondElement
- XML Element end, named Documento Elemento
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 determinada sección de texto puede informarse como varios 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:
- XML Element start, named FirstElement
- XML Nodo de texto, con datos iguales a "pac#xb6;" (el personaje Unicode U+00b6)
- XML Nodo de texto, con datos iguales a "Algún texto"
- XML Element end, named FirstElement
Contenido relacionado
Gzip
Transporte en Dinamarca
Cobertura de código