Trabajar con Oracle y XML en Java

Java OracleEn el anterior post pudimos ver como lo podíamos hacer para almacenar información en formato XML dentro de una tabla Oracle haciendo uso del tipo XMLType. En el presente artículo vamos a ver como podemos hacerlo para trabajar con estos datos desde una sencilla aplicación escrita en Java.

Es posible que, antes de leer este artículo te interese alguno de los siguientes:

En este artículo vamos a utilizar los conocimientos adquiridos en los dos anteriores para trabajar con Oracle, atributos XMLType y Documents XML en Java. Como siempre, vamos a crear una sencilla aplicación a modo de ejemplo para ver, paso a paso cómo podemos crear un Document XML en Java y guardarlo en Oracle para, posteriormente, obtenerlo nuevamente y añadirle alguna modificación.

Creación del Document en Java

Para crear el Document Java, vamos a utilizar un método sencillo que ya se explicó en detalle en el post sobre documentos XML en Java.

public static Document createDocumentXML(Document document){

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     try{
        DocumentBuilder builder = factory.newDocumentBuilder();
        DOMImplementation implementation = builder.getDOMImplementation();
        document = implementation.createDocument(null, "xml", null);

        /*Creación de elementos*/

        //Creamos el elemento raiz Alumno
        Element alumno = document.createElement("Alumno"); 
        //Creamos un nuevo elemento Edad
        Element edad = document.createElement("Edad"); 
        //Ingresamos el valor de la Edad
        Text valorEdad = document.createTextNode("26"); 

        // asignamos la versión de nuestro XML
        document.setXmlVersion("1.0"); 
        //Añadimos el alumno al Document creado
        document.getDocumentElement().appendChild(alumno);
        //Añadimos el elemento edad
        alumno.appendChild(edad);
        //Añadimos el valor de su edad
        edad.appendChild(valorEdad);

     }catch(Exception e){
         System.err.println("Error: "+e);
     }

     return document;
}

Convertir un Document XML Java a String

Para almacenar nuestro Document en un campo XMLType de Oracle, antes debemos transformarlo a String. Para ello, podemos utilizar la siguiente clase.

public static String getStringFromDocument(Document document){
    try {
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        //Decidimos no omitir la declaración XML ("yes" para omitirla)
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");

        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(document), new StreamResult(writer));

        String output = writer.getBuffer().toString();

        //Devolvemos el String
        return output;
    }catch(Exception e){
    }
    return "";
}

Guardar el Document en Oracle

En las siguientes dos clases podemos realizar correctamente una conexión con nuestro servidor Oracle y guardar el String generado anteriormente en nuestra base de datos. Esta inserción debería adaptarse a cada caso.

private static Statement getOracleStatement() throws SQLException{
    //Registramos el driver odbc
    DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());

    //Creamos la conexión
    Connection conn = DriverManager.getConnection
          ("jdbc:Oracle:thin:@10.5.10.1:1521:XE", "aitor", "aitor");
    //        driver         @machineName:port:SID, userid, password

    //Devolvemos el statement sobre el que realizaremos consultas a la base de datos
    return conn.createStatement();
}

public static void insertDB(Document document) throws SQLException{

    Statement stmt = getOracleStatement();

    //Realizamos la inserción. Utilizamos el método getStringFromDocument para
    //obtener un String del document generado anteriormente
    stmt.executeUpdate("INSERT INTO alumnosXMLType VALUES(1, XMLType('"+
                                      getStringFromDocument(document)+"'))");

    //cerramos la conexión
    stmt.close();
}

Recuperar un Document de Oracle

Si queremos recuperar datos XML almacenados en un campo XMLType en una tabla Oracle podemos hacerlo utilizando un simple SELECT. Para saber más sobre las consultas en campos XMLType puedes repasar el artículo Uso de XML en Oracle. La clase que se muestra a continuación nos devolverá  los diferentes alumnos que tenemos almacenados.

public static String getXMLFromDB() throws SQLException{
    Document oracleDocument = null;
    Statement stmt = getOracleStatement();
    String resultSet="";

    //Realizamos la consulta
    ResultSet rset = 
     stmt.executeQuery("SELECT DISTINCT a.alumno.getStringVal() from alumnosXMLType a");

    rset.next();
    resultSet = rset.getString(1);
    //Mostramos el resultado por pantalla directamente del rset
    //System.out.println (restulSet);

    //cerramos la conexión
    stmt.close();

    return resultSet;
}

Convertir el ResultSet Oracle en Document XML de Java

Para trabajar correctamente y de forma sencilla con XML en Java, es necesario convertir el String obtenido de Oracle en un Document XML. El código mostrado a continuación realiza esta tarea.

public static Document getDocumentFromXMLString(String xmlSource) 
        throws SAXException, ParserConfigurationException, IOException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    return builder.parse(new InputSource(new StringReader(xmlSource)));
}

Modificar un Document XML

Una vez hemos obtenido un Document del método anterior, ya podemos trabajar con él normalmente añadiendo, modificando o eliminando características. Si quieres más información sobre como trabajar con XML en Java puedes releer el post Lectura y escritura de documentos XML en Java.

public static Document updateDocument(Document document){
    //Creamos un nuevo elemento a Alumno
    Element contacto = document.createElement("Contacto");
    //Le añadimos una característica
    Element telefono = document.createElement("Telefono");
    //Le añadimos su valor
    Text valorTelefono = document.createTextNode("600 000 000");

    //Añadimos la información al alumno recuperado de la BD
    NodeList nodoRaiz = document.getDocumentElement().getElementsByTagName("Alumno");
    nodoRaiz.item(0).appendChild(contacto);
    contacto.appendChild(telefono);
    telefono.appendChild(valorTelefono);

    return document;
}

Mostrar un Document XML por pantalla

En cualquier momento, al desarrollar nuestra aplicación, nos puede ser útil mostrar por pantalla el estado actual de un Document XML para cerciorarnos que está ocurriendo lo que debería estar ocurriendo. El siguiente método nos muestra el contenido del Document pasado como parámetro.

public static void showDocument(Document document){
    try {
        TransformerFactory transFact = TransformerFactory.newInstance();

        //Añadimos sangrado y la cabecera de XML
        transFact.setAttribute("indent-number", new Integer(3));
        Transformer trans = transFact.newTransformer();
        trans.setOutputProperty(OutputKeys.INDENT, "yes");
        trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");

        //Hacemos la transformacion
        StringWriter sw = new StringWriter();
        StreamResult sr = new StreamResult(sw);
        DOMSource domSource = new DOMSource(document);
        trans.transform(domSource, sr);

        //Mostrar información por consola
        Result console= new StreamResult(System.out);
        trans.transform(domSource, console);
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

Finalmente podríamos crear un main desde dónde llamar a todos estos métodos para realizar el proceso completo. Hay que tener presente que, en el siguiente ejemplo, una vez hemos modificado el documento XML obtenido de la base de datos no lo volvemos a guardar en ella con lo que los cambios no serán efectivos. Solo se realiza la modificación a modo de ejemplo.

public static void main(String[] args) throws SQLException {
    Document document = null;

    document = createDocumentXML(document);

    System.out.println("Mostramos el Document creado");
    showDocument(document);

    //Insertamos el document XML en la base de datos
    insertDB(document);

    //Obtenemos nuevamente los documentos guardados en la BD
    String xml = getXMLFromDB();

    //Generamos un Document XML a partir del String obtenido de la BD
    try {
        document = getDocumentFromXMLString(xml);
    } catch (SAXException | ParserConfigurationException | IOException e) {
        e.printStackTrace();
    }

    System.out.println("Mostramos el Document obtenido de Oracle");
    showDocument(document);

    //Modificamos
    document = updateDocument(document);

    //Mostramos el document final por pantalla
    System.out.println("Mostramos el Document modificado");
    showDocument(document);
}

Finalmente, para hacer funcionar el conjunto de métodos anteriores deberíamos incluir los siguientes imports:

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

Con estos ejemplos como base deberíamos ser capaces de trabajar comodamente con Java, XML y Oracle.

Anuncios

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: