2008-11-24 1 views
61

Voici le code actuellement utilisé.Existe-t-il un moyen plus élégant de convertir un document XML en chaîne en Java que ce code?

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; 
     } 
    } 

Répondre

77

Avis sur 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

Est-ce que Java 7 a fourni une autre alternative? –

+0

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

12

L'API du transformateur est le seul moyen XML standard pour transformer à partir d'un objet DOM à une forme sérialisé (String dans ce cas). En tant que norme, je veux dire SUN Java XML API for XML Processing.

D'autres alternatives telles que Xerces XMLSerializer ou JDOM XMLOutputter sont des méthodes plus directes (moins de code) mais elles sont spécifiques au framework. À mon avis, la façon dont vous avez utilisé est la plus élégante et la plus portable de toutes. En utilisant une API Java XML standard, vous pouvez brancher l'XML-Parser ou XML-Transformer de votre choix sans changer le code (le même que les pilotes JDBC). Y a-t-il quelque chose de plus élégant que ça?

13

Ceci est un peu plus concis:

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; 
} 

Sinon, vous pouvez utiliser une bibliothèque comme XMLSerializer d'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

J'aime la deuxième variante. Avec JRE 1.8.0 'XMLSerializer' fait même partie de' rt.jar' –

8

Vous pouvez utiliser XOM faire peut-être ceci:

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

+1, XOM (et d'autres bibliothèques similaires) peut vraiment simplifier les choses. – Jonik