La estructura DOM toma la forma de un árbol, donde cada parte del XML se encontrará representada en forma de nodo. En función de la posición en el documento XML, hablaremos de diferentes tipos de nodos. El nodo principal que representa todo el XML entero denomina documento, y las diversas etiquetas, incluida la etiqueta raíz, se conocen como nodos elemento. El contenido textual de una etiqueta se instancia como nodo de tipo TextElement
y los atributos como nodos de tipo Atribute
. Cada nodo específico dispone de métodos para acceder a sus datos concretos (nombre, valor, nodos hijos, nodo padre, etc.).
El DOM resultante obtenido de un XML termina siendo una copia exacta del archivo, pero con una disposición distinta. Tanto el DOM como el XML tendrán información no visible, como los retornos de carro, que deben tenerse en cuenta para saber cómo procesar correctamente el contenido y evitar sorpresas un poco comprensibles.
Debes tener en cuenta que al mapear XML los retornos de carro se interpretan en DOM como un hijo y que el contenido textual de las etiquetas se plasma en el DOM como un nodo hijo de la etiqueta contenedora. Es decir, para obtener el texto de una etiqueta hay que obtener el primer hijo de ésta.
La interfaz Documentcontempla
un conjunto de métodos para seleccionar diferentes partes del árbol a partir del nombre de la etiqueta o de un atributo identificador. Las partes del árbol se devuelven como objetos Element
, los cuales representan un nodo y todos sus hijos. De este modo, podremos ir explorando partes del árbol sin necesidad de tener que pasar por todos los nodos.
interfaces DOM
DOM define varias interfaces, las mas comunes son las siguientes
Node
− Representa a cualquier nodo del documento.
Element
− expone propiedades y métodos para manipular los elementos del documento y sus atributos.
Attr
− Representa un atributo de un elemento.
Text
− Contenido de un elemento o atributo.
Document
− Representa al documento XML completo. Generalmente nos referiremos a el como árbol DOM. Proporciona información del documento. Permite crear nuevos nodos en el documento.
NodeList
. Colección de nodos a los que se puede acceder por medio de un índice.
metodos DOM mas usuales
Document.getDocumentElement()
− Retorna el elemento raiz del documento.
Node.getFirstChild()
− Retorna el primer nodo hijo del nodo.
Node.getLastChild()
− Retorna el ultimo nodo hijo del nodo.
Node.getNextSibling()
− Retorna el siguiente hermano de un nodo.
Node.getPreviousSibling()
− Retorna el hermano anterior de un nodo.
Node.getAttribute(attrName)
− Retorna el atributo del nodo con el nombre que se pasa como atributo.
Para facilitar la obtención del contenido de un Element
ampliaremos las utilidades de la clase XmlCtrlDom
añadiendo dos métodos más.
public static String getValorEtiqueta ( String etiqueta, Element elemento ) {
Nodo nValue = elemento. getElementsByTagName ( etiqueta ) . item ( 0 ) ;
return nValue. getChildNodes . item ( 0 ) . getNodeValue ;
}
public static Elemento getElementEtiqueta ( String etiqueta, Element elemento ) {
return ( Element ) elemento. getElementsByTagName ( etiqueta ).item ( 0 ) ;
}
El primero recibe el nombre de la etiqueta y el elemento (o nodo parcial del árbol) a partir del cual se desea realizar la búsqueda. Utilizando el método getElementsByTagName
, conseguiremos todos los nodos que tengan por nombre el valor del parámetro etiqueta. Es decir, nos devolverá una colección de nodos. Si sólo existe un único nodo con el nombre del parámetro, éste ocupará la primera posición de la lista. Por ello accedemos con el método item, indicando que nos interesa el primer elemento (posición cero).
El segundo método es muy similar al primero, pero en vez de recuperar el texto, obtendremos el nodo con todos los hijos que tenga. Es útil para aplicar a nodos intermedios (no textuales).
Los objetos Elemento disponen de métodos para añadir nuevos hijos ( appendChild
) o asignar el valor a un atributo ( setAtributte
). También permiten la consulta del valor de los atributos ( getAttributte
) o la navegación por los nodos del árbol ( getParentNode
, para obtener el padre; getFirstChild/getLastChild
, para obtener el primer / último hijo, o getNextSiblingpara
navegar de hermano en hermano).
El objeto Document hará de factory para cualquier nodo del documento. La creación de nuevos elementos (etiquetas) implicará el uso de createElement
. Si queremos crear contenido textual habrá llamar al método createTextNode
, y si lo que queremos son comentarios llamaremos createComment.
La creación de nodos no implica la ubicación de este dentro del árbol. Es decir, además de crearlos habrá asignarlos a un padre usando appendChild
.