OPERACIONES SOBRE FICHEROS XML CON DOM
Abrir un fichero XML
Siendo la variable fichero la que hace referencia al fichero XML (como objeto File, String o InputStream), con estas instrucciones se obtiene en memoria el contenido completo del fichero XML:
DocumentBuilderFactory dBF = DocumentBuilderFactory.newInstance();DocumentBuilder dB = dBF.newDocumentBuilder();Document doc = dB.parse(fichero);
Si se desea obtener el contenido de un documento XML desde Internet, en lugar de la referencia al fichero que se hace al final, se debe usar algo como:
URL dir = new URL("http://direccionDelFicheroXML");
Document doc = dB.parse(dir.openStream());
A partir de ese momento, todas las acciones sobre el documento XML se deberán realizar sobre la variable documento de la clase Document de Java, que permite la gestión de documentos XML basándose en el modelo DOM.
Las clases DocumentBuilderFactory y DocumentBuilder se encuentran en el paquete javax.xml.parsers de Java, y la clase Document es del paquete org.w3c.dom, por lo que se requiere importar dichos paquetes para usar estas clases.
Mostrar o guardar el contenido de un
documento XML
Para realizar cualquiera de esas operaciones, es necesario crear previamente un transformador al que se le indique el documento y el destino que se le va a dar.
TransformerFactory tF = TransformerFactory.newInstance();Transformer t= tF.newTransformer();Source origen = new DOMSource(doc);
El objeto transformador que se ha creado dispone de un método transform que permite realizar el volcado del documento que se encuentra en memoria o otro formato. Se deben indicar dos parámetros: el primero es el documento de origen, y el segundo puede ser un objeto Result, en el que se obtendrá el resultado de la transformación. Para obtener un objeto Result se puede crear un objeto de la clase StreamResult indicando como parámetro un objeto File, OutpuStream, String o Writer.
Por ejemplo, para obtener el resultado en un fichero llamado salida.xml:
Result destino = new StreamResult("salida.xml");transformador.transform(origen, destino);
Si por el contrario, se desea obtener el resultado en la salida estándar:
Result destino = new StreamResult(System.out);transformador.transform(origen, destino);
Para obtener el contenido como String, y mostrarlo en la salida estándar:
StringWriter writer = new StringWriter();Result destino = new StreamResult(writer);transformador.transform(origen, destino);System.out.println(writer.toString());
Crear un documento XML en blanco
Las clases DocumentBuilderFactory y DocumentBuilder permiten la generación de un documento XML vacío almacenándolo en memoria. Para ello se debe utilizar el método newDocument() de esa última clase:
DocumentBuilderFactory dBF = DocumentBuilderFactory.newInstance();DocumentBuilder dB = dBF.newDocumentBuilder();Document doc = dB.newDocument();
Si se muestra el contenido del objeto documento que se ha creado, se puede observar algo como lo siguiente:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
Métodos principales de la clase Document para
obtener información
Element getDocumentElement()
Obtiene el elemento raíz del documento.
NodeList getElementsByTagName(String etiqueta)
Retorna una lista NodeList con todos los elementos del documento que tienen la etiqueta indicada.
Ya que la clase Document es una subclase de la clase Node, además de estos métodos propios, se pueden utilizar los métodos de la clase Node que se han comentado también en Operaciones sobre nodos DOM XML en Java.
Métodos principales de la clase Document para
crear nodos
Los siguientes métodos de la clase Document permiten la creación de cada uno de los posibles tipos de nodos admitidos por XML:
Attr createAttribute(String name)
CDATASection createCDATASection(String data)
Comment createComment(String data)
DocumentFragment createDocumentFragment()
Element createElement(String tagName)
EntityReference createEntityReference(String name)
ProcessingInstruction createProcessingInstruction(String target, String data)
Text createTextNode(String data)
Nodos en el modelo DOM de XML
En el modelo DOM para XML, se considera un nodo a cualquier cosa que se encuentra dentro del documento:
· Todo el documento en su conjunto es un nodo documento.
· Cada elemento XML es un nodo elemento.
· El texto de los elementos XML son nodos texto.
· Cada atributo es un nodo atributo.
· Los comentarios son nodos comentario.
Para manipular los nodos en Java se dispone de la clase Node, que se encuentra en el paquete org.w3c.dom al igual que las clases de los distintos tipos de nodos que se acaban de comentar. Los nombres de estas clases coinciden con las de otras clases de otros paquetes de Java, por lo que puede ser recomendable importar todas las clases de ese paquete para evitar confusiones:
import org.w3c.dom.*
Métodos principales para navegación por
los nodos
Node getFirstChild()
Retorna el primer nodo hijo de este nodo. Si no lo hay, retorna null.
Node getNextSibling()
Retorna el nodo inmediatamente siguiente (hermano) a este nodo. Si no lo hay, retorna null.
Node getParentNode()
Retorna el padre de este nodo. Todos los nodos, excepto los de tipo Attr, Document, DocumentFragment, Entity, y Notation pueden tener un padre. Sin embargo, será null si el nodo está recién creado y no ha sido añadido todavía al árbol, o si ha sido eliminado del árbol.
NodeList getChildNodes()
Retorna una lista de la clase NodeList que contiene todos los nodos hijo de este nodo. Si no hay nodos hijo, la lista estará vacía.
La clase NodeList dispone de los siguientes métodos que permiten obtener los nodos que componen una de esas listas:
int getLength()
Retorna el número de nodos de la lista.
Node item(int index)
Retorna el nodo de la lista que ocupa la posición index.
Métodos principales para gestionar los
nodos
Node appendChild(Node hijoNuevo)
Añade el nodo hijoNuevo al final de la lista de hijos de este nodo. Si el hijoNuevo ya está en el árbol, se elimina previamente. Retorna el nodo que se ha añadido.
Node insertBefore(Node hijoNuevo, Node hijoReferencia)
Inserta el nodo hijoNuevo antes del nodo hijoReferencia que ya existe. Si el nodo hijoReferencia es null, se inserta el nodo hijoNuevo al final de la lista de nodos hijo. Retorna el nodo que se ha insertado.
Node removeChild(Node hijoViejo)
Elimina, de la lista de hijos, el hijo indicado por parámetro como hijoViejo y lo retorna.
Node replaceChild(Node hijoNuevo, Node hijoViejo)
Sustituye el nodo hijoViejo que se encuentre en la lista de nodos hijo por el nodo hijoNuevo.
Métodos principales para manipular la
información del nodo
short getNodeType()
Retorna un código identificativo del tipo de nodo que se trata. Para trabajar cómodamente con esos códigos, la clase Node proporciona una serie de constantes para identificar los tipos de nodos:
|
Tipo de nodo |
Constante |
|
ATTRIBUTE_NODE |
|
|
CDATA_SECTION_NODE |
|
|
COMMENT_NODE |
|
|
DOCUMENT_NODE |
|
|
DOCUMENT_FRAGMENT_NODE |
|
|
DOCUMENT_TYPE_NODE |
|
|
ELEMENT_NODE |
|
|
ENTITY_NODE |
|
|
ENTITY_REFERENCE_NODE |
|
|
NOTATION_NODE |
|
|
PROCESSING_INSTRUCTION_NODE |
|
|
TEXT_NODE |
String getNodeName()
Retorna el nombre de nodos de determinados tipos, como los atributos (Attr) y elementos (Element).
String getNodeValue()
Retorna el valor de nodos de determinados tipos, como los atributos (Attr), comentarios (Comment) y textos (Text).
String getTextContent()
Retorna el texto del nodo y de sus descendientes.
void setNodeValue(String valorNodo)
Establece el valor de nodos de determinados tipos, como los atributos (Attr), comentarios (Comment) y textos (Text).
Comentarios
Publicar un comentario