Parsing XML
De TW
- Este artículo ha sido reformateado automáticamente desde http://www.tejedoresdelweb.com/307/article-2146.html y su formato necesita ser revisado
Dado que XML es un lenguaje establecido ampliamente en la comunidad de desarrolladores Web, existen ya herramientas y estándares de programación para leer documentos XML.
Tabla de contenidos |
¿Qué es un parser XML?
Un Parser es un módulo, biblioteca o programa que se ocupa de transformar un archivo de texto en una representación interna. En el caso de XML, como el formato siempre es el mismo, no necesitamos crear un parser cada vez que hacemos un programa, hay muchos parsers disponibles.
Los parser de XML se clasifican en SAX y DOM.
También se hace distinción entre los que son Validantes y los No Validantes. Los primeros verifican que el documento, además de estar bien formado de acuerdo a las reglas de XML, responda a una estructura definida en una DTD.
SAX Parsers
SAX significa Simple API for XML. Un parser SAX tiene una interfaz del estilo:
saxParse( documento, f_inicio_elemento, f_fin_elemento, f_texto )
En que los principales argumentos son punteros a funciones. Estas funciones serán ejecutadas por el parser cuando él se encuentre con un elemento inicial, con uno final, o con texto.
Por ejemplo, en el documento <p>Hola <b>mundo</b></p>, si ejecuto saxParse( documento, fstart, fend, ftext ), se produce la siguiente secuencia de invocaciones:
fstart(http://www.w3.org/TR/REC-xml-names/"p") ftext("Hola") fstart("b") ftext("mundo") fend("b") fend("p")
DOM Parsers
DOM significa Document Object Model. Un parser DOM tiene una interfaz del estilo:
nodoRaiz = domParse( documento )
Y lo que produce es un árbol de nodos, en el ejemplo anterior, produciría algo así, considerando una notación tipo LISP:
(p "Hola" (b "mundo"))
En que el primer elemento de las listas es la raíz.
Comparación
Un SAXParser es una herramienta más versátil, más veloz y menos potente que un DOMParser. Requiere de mayor programación hacer algo útil con ella, pero puede ser muy buena idea si por ejemplo, lo que interesa es rescatar un fragmento de un documento, buscar sólo un elemento en particular.
En contraste, un DOMParser es menos versátil, más lento, pero una vez usado no tengo que desarrollar nada más. El DOMParser me entrega el árbol construído y listo, así que no necesito nada más para funcionar.
Obviamente, un DOMParser puede implementarse encima de un SAXParser.
nodo_actual = null define fstart(elemento) := ( nodo_actual == null ) ? nodo_actual = elemento : nodo_actual.agregaHijo( elemento ) define fend(elemento) := nodo_actual = nodo_actual.obtienePadre() define ftext(texto) := nodo_actual.guardaContenido( texto ) saxParse( document, fstart, fend, ftext ) return nodo_actual
Hay que agregar una serie de salvedades que permiten ir verificando en línea que se cierren todos los elementos que se abran, etc.