domingo, 27 de marzo de 2011

Cómo leer un fichero XML en Java y su aplicación práctica (Primera parte)

Introducción

Antes de nada, para llegar a una mejor comprensión de la materia, explicaremos qué es XML y qué es DOM.

XML (eXtensible Markup Languaje) es un conjunto de reglas y tecnologías, que permiten definir nuevos lenguajes basados en etiquetas, para la creación de documentos para el intercambio de información estructurada entre aplicaciones informáticas.

XML no es realmente un lenguaje en particular, sino una manera de definir lenguajes para diferentes necesidades. Algunos de los lenguajes que usan XML para su definición son XHTML, SVG, MathML, RSS, CML y WML.

Ha sido desarrollado y mantenido por World Wide Web Consortium W3C y entre sus características más destacadas se encuentran que es un meta-lenguaje de marcas y que define la estructura y semántica, pero no el formato de presentación.

La tecnología XML busca dar solución al problema de expresar información estructurada de la manera más abstracta y reutilizable posible. Que la información sea estructurada quiere decir que se compone de partes bien definidas, y que esas partes se componen a su vez de otras partes. Entonces se tiene un árbol de trozos de información.

Estas partes se llaman elementos, y se las señala mediante etiquetas.

Una etiqueta consiste en una marca hecha en el documento, que señala una porción de éste como un elemento. Un pedazo de información con un sentido claro y definido. Las etiquetas tienen la forma , donde nombre es el nombre del elemento que se está señalando.

A continuación se muestra un ejemplo para entender la estructura de un documento XML:















Ya sólo nos resta saber algo de DOM para continuar con lo que nos interesa, que es leer el contenido de un fichero XML para presentar los datos a nuestro antojo.

El Document Object Model o DOM (Modelo de Objetos del Documento) es esencialmente una interfaz de programación de aplicaciones (API) que proporciona un conjunto estándar de objetos para representar documentos HTML y XML, un modelo estándar sobre cómo pueden combinarse dichos objetos, y una interfaz estándar para acceder a ellos y manipularlos. A través del DOM, los programas pueden acceder y modificar el contenido, estructura y estilo de los documentos HTML y XML, que es para lo que se diseñó principalmente.

El responsable del DOM es el World Wide Web Consortium (W3C).

Como leer un fichero XML en Java

El paquete javax.xml.parsers

Este paquete es el punto de partida para usar DOM en Java. Contiene dos clases fundamentales: DocumentBuilderFactory y DocumentBuilder.

Obteniendo una instancia de DocumentBuilderFactory

La clase DocumentBuilderFactory posee un método estático que permite obtener una instancia de esta misma clase.

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

La clase DocumentBuilder

La fábrica DocumentBuilderFactory nos permite crear parsers con características de comportamiento determinadas. Podemos obtener información sobre estos comportamientos a través de métodos isXXX() y podemos establecerlos a través de métodos setXXX(). Estableciendo estas propiedades la fábrica nos devolverá objetos DocumentBuilder que posean un parser con los comportamientos deseados; si la fábrica no es capaz de crear objetos con estos comportamientos se lanzará una excepción del tipo javax.xml.parsers.ParserConfigurationException. Obtener una instancia de DocumentBuilder es bien sencillo. Basta invocar el método newDocumentBuilder().

DocumentBuilder db = dbf.newDocumentBuilder();

Cargar documentos: la interfaz Document

Esta clase se encuentra en el paquete org.w3c.dom. Existen formas para crear un documento vacío, pero lo que a nosotros nos interesa es cargar un documento a partir de un fichero XML. Podemos cargar un documento desde un archivo, indicando una URI, o a través de un InputStream. También podemos usar la clase org.xml.sax.InputSource que encapsula cualquier fuente de datos. En nuestro caso cargaremos un fichero especificando la URI que indica donde se encuentra el fichero XML que queremos cargar. El método parse() sobrecargado se encarga de realizar esta operación.

Document d = db.parse(“http://www.elpais.com/rss/feed.html?feedId=1002”);

Manejo de datos: la interfaz Node

El objeto Document permite obtener listados de elementos por nombre de etiqueta y/o por espacio de nombres y también podemos buscar un elemento por su identificador. Los listados de elementos se devuelven en forma de NodeList. NodeList es una interfaz que sólo define dos métodos: getLength() que devuelve la longitud de la lista e item(int index) que devuelve un Node de la lista por su índice. Un NodeList puede ser recorrido también mediante java.util.Iterator.

La interfaz Node es la interfaz base ya que todos los objetos de un árbol DOM son nodos. Todos los nodos tienen un campo ownerDocument que referencia al documento que lo contiene, a excepción de los documentos, cuyo ownerDocument es null. La mayoría de los nodos tienen un nodo padre, y todos los nodos tienen un hermano anterior y un hermano siguiente (previousSibling y nextSibling). Para obtener estos objetos llamamos a los métodos getOwnerDocument(), getParentNode(), getPreviousSibling() y getNextSibling() respectivamente. Estos métodos permiten recorrer todo el árbol de nodos.

Todos los nodos tienen un nombre y un valor. Para obtener estas propiedades usamos

getNodeName() y getNodeValue() respectivamente. Realmente la mayoría de los nodos devuelven null en getNodeValue() y la mayoría de los nodos devuelven un valor constante en getNodeName() tales como #document, #comment, etc. En la documentación de Java podemos ver la tabla de valores que devolverán los diferentes tipos de nodos.

Hay que tener en cuenta que muchos nodos no tendrán hijos, aún así, la interfaz Node provee métodos para manipular los nodos hijos de cualquier nodo. Podemos obtener el primer nodo hijo mediante getFirstChild(); podemos obtener el último nodo hijo mediante getLastChild() y podemos obtener una lista (NodeList) de hijos mediante getChildNodes().

Una vez que tenemos el documento cargado podemos obtener los datos que necesitemos por medio de sus etiquetas.

NodeList nodos = d.getElementsByTagName(“item”);

La sentencia anterior obtiene una lista con todos los nodos cuya etiqueta sea item. Para acceder a los hijos de un nodo extraemos el nodo de la lista anterior:

Node nodo = nodos.item(indice);

//indice es un valor entre 0 y nodos.getLength()

Podemos extraer información de un nodo:

//Obtiene el primer nodo hijo del nodo

Node primerHijo = nodo.getFirstChild();

//Obtiene el siguiente hermano de primerHijo

Node siguiente = primerHijo.getNextSibling();

//Obtiene el nombre del nodo

String nombre = nodo.getNodeName();

//Obtiene el contenido textual del nodo

String contenido = nodo.getTextContent();

Mucha de la información expuesta ha sido extraída del documento “Java y DOM” elaborado por Alberto Gimeno.

No hay comentarios:

Publicar un comentario