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 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 FileOutpuStreamString 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

Attr

ATTRIBUTE_NODE

CDATASection

CDATA_SECTION_NODE

Comment

COMMENT_NODE

Document

DOCUMENT_NODE

DocumentFragment

DOCUMENT_FRAGMENT_NODE

DocumentType

DOCUMENT_TYPE_NODE

Element

ELEMENT_NODE

Entity

ENTITY_NODE

EntityReference

ENTITY_REFERENCE_NODE

Notation

NOTATION_NODE

ProcessingInstruction

PROCESSING_INSTRUCTION_NODE

Text

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

Entradas populares de este blog

Ficheros (4/5). Flujos de bytes. Ejercicio 9

Ficheros (3/?). Flujos de caracteres. FileWriter, BufferedWrite, PrintWriter