Trabajando con XML: Java XML API para la creación de ficheros y Simple framework para mensajes SOAP

En este caso para la creación de un fichero XML con API que provee Java, me he encontrado con algunos problemas, que os paso a detallar por si puede ser de utilidad y como recordatorio:

DocumentBuilderFactory icFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder icBuilder;
icBuilder = icFactory.newDocumentBuilder();
Document doc = icBuilder.newDocument();
doc.setXmlVersion("1.0");
doc.setXmlStandalone(true);

doc.insertBefore(doc.createComment("SUSTITUIR POR SALTO DE LINEA"), doc.getDocumentElement());

Element dataroot = doc.createElement("dataroot");

// para escribir UTF-8
DOMImplementation domImpl = icBuilder.getDOMImplementation();
DOMImplementationLS implLS = (DOMImplementationLS) domImpl.getFeature("LS", "3.0");
LSSerializer lsSerializer = implLS.createLSSerializer();
lsSerializer.getDomConfig().setParameter("format-pretty-print", true);

LSOutput lsOutput = implLS.createLSOutput();
lsOutput.setEncoding("UTF-8");
Writer stringWriter = new StringWriter();
lsOutput.setCharacterStream(stringWriter);
lsSerializer.write(doc, lsOutput);

//atributos dataroot
dataroot.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:od", "urn:schemas-microsoft-com:officedata");
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
String strDate = sdfDate.format(new Date());
dataroot.setAttribute("generated", strDate);

Para añadir la codificación, este caso UTF-8, a la cabecera del xml, generando:

<?xml version=”1.0″ encoding=”UTF-8″?>

// para escribir UTF-8
DOMImplementation domImpl = icBuilder.getDOMImplementation();
DOMImplementationLS implLS = (DOMImplementationLS) domImpl.getFeature("LS", "3.0");
LSSerializer lsSerializer = implLS.createLSSerializer();
lsSerializer.getDomConfig().setParameter("format-pretty-print", true);

LSOutput lsOutput = implLS.createLSOutput();
lsOutput.setEncoding("UTF-8");
Writer stringWriter = new StringWriter();
lsOutput.setCharacterStream(stringWriter);
lsSerializer.write(doc, lsOutput);

Si se quieren añadir  atributos al nodo root:

//atributos dataroot
dataroot.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:od", "urn:schemas-microsoft-com:officedata");
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
String strDate = sdfDate.format(new Date());
dataroot.setAttribute("generated", strDate)

Qué sucede si es obligatorio incluir un salto de línea, después de la cabecera XML: No es posible añadir un nodo antes del nodo root para crear un salto de línea pero sí que se puede incluir un comentario:

doc.insertBefore(doc.createComment("SUSTITUIR POR SALTO DE LINEA"), doc.getDocumentElement());

Después sustituiremos ese comentario por lo que necesitemos. No es lo más elegante pero es el atajo más rápido y no es necesario buscar una forma alternativa para crear el xml.

transformer.transform(new DOMSource(doc), new StreamResult(outputXmlStringWriter));
 String outputXmlString = outputXmlStringWriter.toString().replaceFirst("<!--SUSTITUIR POR SALTO DE LINEA-->", "\n");

Para terminar, si queréis crear el XML que se envía en un mensaje SOAP de forma diferente, tenéis Simple Framework. Tiene además en su web una zona de tutoriales bastante completos. De su web:

“Simple is a high performance XML serialization and configuration framework for Java. Its goal is to provide an XML framework that enables rapid development of XML configuration and communication systems. This framework aids the development of XML systems with minimal effort and reduced errors. It offers full object serialization and deserialization, maintaining each reference encountered. In essence it is similar to C# XML serialization for the Java platform, but offers additional features for interception and manipulation.”

Fuentes:

http://stackoverflow.com/questions/8449316/how-to-create-attribute-xmlnsxsd-to-xml-node-in-java

http://possiblelossofprecision.net/?p=1150

http://stackoverflow.com/questions/24551962/adding-linebreak-in-xml-file-before-root-node

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

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