Gibt es eine elegantere Möglichkeit, ein XML-Dokument in Java in einen String zu konvertieren als diesen Code?

70

Hier ist der aktuell verwendete 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;
        }
    }
Brian
quelle

Antworten:

84

Verlässt sich auf DOM Level3 Laden / Speichern :

public String getStringFromDoc(org.w3c.dom.Document doc)    {
    DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation();
    LSSerializer lsSerializer = domImplementation.createLSSerializer();
    return lsSerializer.writeToString(doc);   
}
ykaganovich
quelle
2
Hat Java 7 eine weitere Alternative bereitgestellt?
Brian
import import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSSerializer;
David Portabella
13

Die Transformator-API ist die einzige XML-Standardmethode zum Transformieren von einem DOM-Objekt in ein serialisiertes Formular (in diesem Fall String). Standardmäßig meine ich die SUN Java XML API für die XML-Verarbeitung .

Andere Alternativen wie Xerces XMLSerializer oder JDOM XMLOutputter sind direktere Methoden (weniger Code), aber sie sind Framework-spezifisch.

Meiner Meinung nach ist die Art und Weise, wie Sie sie verwendet haben, die eleganteste und tragbarste von allen. Mithilfe einer Standard-XML-Java-API können Sie den XML-Parser oder XML-Transformer Ihrer Wahl anschließen, ohne den Code zu ändern (wie bei JDBC-Treibern). Gibt es etwas eleganteres als das?

Fernando Miguélez
quelle
13

Dies ist etwas prägnanter:

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

Andernfalls könnten Sie eine Bibliothek wie XMLSerializer von Apache verwenden:

//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());
digitalsanctum
quelle
Ich mag die zweite Variante. Mit JRE ist 1.8.0 XMLSerializersogar Teil vonrt.jar
Würgspaß
8

Sie könnten XOM verwenden , um dies möglicherweise zu tun:

org.w3c.dom.Document domDocument = ...;
nu.xom.Document xomDocument = 
    nu.xom.converters.DOMConverter.convert(domDocument);
String xml = xomDocument.toXML();
Toolkit
quelle
1
+1, XOM (und andere ähnliche Bibliotheken) können die Sache wirklich vereinfachen.
Jonik