XML

XML, siglas en inglés de eXtensive Markup Language, es un metalenguaje extensible de etiquetas desarrollado por el Worl Wide Web Consortium (W3C).

Los documentos XML tienen muchísimas utilidades, pero en mi caso, los he utilizado y utilizo para dos muy concretas:

  • comunicación entre una aplicación clinte y un servidor. En est caso creamos una API basada en ficheros XML.
  • ficheros de confiuración de aplicaciones.

Ficheros XML en Java

Para trabajar con ficheros XML en Java existen dos API’s que son SAX y DOM.

Yo no he trabajado con SAX por una sóla razón, no permite modificar un fichero XML, cosa que DOM sí hace y que para mi es necesario. Además la progrmación es bastante más sencila en el caso de DOM. Como contrapartida, DOM consume más memoria porque carga todo el fichero en memoria y SAX no.

Con todos estos puntos sobre la mesa, yo me quedo con DOM. Esta API carga el contenido del docmento XML en un Document a partir del cuál se obtiene toda la información.

Carga de un fichero XML con DOM

Lo primero es leer un fichero XML y cargarlo como un Document.


try {
 FileInputStream fileInputStream = new FileInputStream("fichero.xml");
 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
 Document xmlDocument = documentBuilder.parse(fileInputStream);
} catch (Exception e) {
 e.printStackTrace();
}

De esta forma ya tenemos fichero XML para poder trabajar con él.

Otra opción interesante es la de poder cargar un fichero XML a partir de una cadena. Por ejemplo, si recibimos un XML a través de una petición http, aquí nos interesa cargar esa cadena en un objeto de tipo Document.


try {
 DOMParser domParser = new DOMParser();
 domParser.parse(new InputSource(new StringReader(xmlString)));
 Document xmlDocument = domParser.getDocument();
} catch (Exception e) {
 e.printStackTrace();
}

Lectura de un fichero XML

Una vez creado el objeto de tipo de Document ya se puede empezar a tratar el fichero XML. Y aquí hay dos maneras de hacerlo. Explico primero la que yo utilizo y porqué, y después paso a detallar la otra.

Lo primero que hay que hacer para poder leer el fichero es obtener el elemento raíz y para ello tenemos el método getDocumentElement().


Element rootElement = xmlDocument.getDocumentElement();

A partir del elemento raíz ya se puede leer todo el fichero. Para ello tenemos el método getElementsByTagName(String) que obtiene todas las etiquetas que coinciden con el parámetro.


NodeList elements = rootElement.getElementsByTagName("element");

Con la lista NodeList ya podemos acceder a todos los datos que necesitamos


for (int i = 0; i < elements.getLength(); i++) {
 Element element = (Element) elements.item(i);
 String attribute = element.getAttribute("attribute");
 String value = element.getChildNodes().item(0).getNodeValue();
}

La segunda forma se trata de trabajar con nodos en lugar de elementos, pero el funcionamiento y la idea es exactamente la misma.

Se obtiene el elemento raíz con el método getFirstChild()

Element rootElement = xmlDocument.getFirstChild();

Se obtiene la lista de nodos que hay dentro de ese elemento raíz con el método getChildNodes()


NodeList nodes = rootElement.getChildNodes();

Y se accede a cada uno de los elementos a través de la lista NodeList.


for (int i = 0; i < nodes.getLength(); i++) {
 Node node = nodes.item(i);
 String attribute = node.getNamedItem("attribute");
 String value = node.getNodeValue();
}

Personalmente yo utilizo la primera forma por una simple razón, cuando trabajo con un fichero XML suelo querer acceder a una etiqueta en concreto y ahí, con getElementsByTagName(String) es más fácil y rápido acceder a los elementos. Por el resto, el funcionamiento es exactamente el mismo.

Escritura de un fichero XML

Aquí voy a diferenciar dos acciones, modificar un elemento del fichero o escribir el fichero en disco.

Para añadir un nuevo elemento al fichero XML existen los métodos createElement(String) y appendChild(Node).


Element element = xmlDocument.createElement("newElement");
rootElement.appendChild(element);

Para modificar un elemento del fichero tenemos que trabajar con los objetos Element. Un atributo se establece con el método setAttribute(String, String) donde el primer parámetro es el nombre del atributo y el segundo el valor de ese atributo.


element.setAttribute("attributeName", ""attributeValue");

Y para establece un valor, se utiliza el método setTextContent(String).


element.setTextContent("elementValue");

Si lo que se quiere es grabar un fichero XML en disco, el proceso ya no es tan sencillo, pero tampoco es para desesperarse. Básicamente tenemos que tener el objeto de tipo Document con todo lo que queremos guardar y su codificación.


try {
 FileOutputStream fileOutputStream = new FileOutputStream("filename.xml");
 OutputFormat outputFormat = new OutputFormat("XML", "UTF-8", true);
 outputFormat.setLineSeparator(System.getProperty("line.separator"));
 XMLSerializer xmlSerializer = new XMLSerializer(fileOutputStream, outputFormat);
 xmlSerializer.serialize(xmlDocument);
} catch(Exception e) {
 e.printStackTrace();
}

Anuncios
  1. 4/01/12

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: