2008-11-24 8 views
61

Aquí está el código usado actualmente.¿Existe alguna forma más elegante de convertir un documento XML en una cadena en Java que este código?

public String getStringFromDoc(org.w3c.dom.Document doc) { 
     try 
     { 
      DOMSource domSource = new DOMSource(doc); 
      StringWriter writer = new StringWriter(); 
      StreamResult result = new StreamResult(writer); 
      TransformerFactory tf = TransformerFactory.newInstance(); 
      Transformer transformer = tf.newTransformer(); 
      transformer.transform(domSource, result); 
      writer.flush(); 
      return writer.toString(); 
     } 
     catch(TransformerException ex) 
     { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

Respuesta

77

Se basa en DOM Level3 Load/Save:

public String getStringFromDoc(org.w3c.dom.Document doc) { 
    DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation(); 
    LSSerializer lsSerializer = domImplementation.createLSSerializer(); 
    return lsSerializer.writeToString(doc); 
} 
+2

¿Ha proporcionado Java 7 otra alternativa? –

+0

import import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSSerializer; –

12

La API transformador es la única manera en XML estándar para transformar de un objeto DOM a una forma serializada (String, en este caso). Como estándar me refiero a SUN Java XML API for XML Processing.

Otras alternativas como Xerces XMLSerializer o JDOM XMLOutputter son métodos más directos (menos código) pero son específicos del marco.

En mi opinión, la manera que ha utilizado es la más elegante y portátil de todas. Al usar una API XML Java estándar, puede conectar el XML-Parser o XML-Transformer de su elección sin cambiar el código (lo mismo que los controladores JDBC). ¿Hay algo más elegante que eso?

13

Esto es un poco más concisa:

try { 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    StreamResult result = new StreamResult(new StringWriter()); 
    DOMSource source = new DOMSource(doc); 
    transformer.transform(source, result); 
    return result.getWriter().toString(); 
} catch(TransformerException ex) { 
    ex.printStackTrace(); 
    return null; 
} 

de lo contrario podría utilizar una biblioteca como XMLSerializer de Apache:

//Serialize DOM 
OutputFormat format = new OutputFormat (doc); 
// as a String 
StringWriter stringOut = new StringWriter();  
XMLSerializer serial = new XMLSerializer (stringOut,format); 
serial.serialize(doc); 
// Display the XML 
System.out.println(stringOut.toString()); 
+0

Me gusta la segunda variante. Con JRE 1.8.0 'XMLSerializer' es incluso parte de' rt.jar' –

8

Usted podría utilizar XOM que quizá hacer esto:

org.w3c.dom.Document domDocument = ...; 
nu.xom.Document xomDocument = 
    nu.xom.converters.DOMConverter.convert(domDocument); 
String xml = xomDocument.toXML(); 
+1

+1, XOM (y otras bibliotecas similares) realmente pueden simplificar las cosas. – Jonik

Cuestiones relacionadas