Есть ли более элегантный способ преобразовать XML-документ в строку в Java, чем этот код?

Вот код, который используется в настоящее время.

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;
        }
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
70
0
72 883
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

API-интерфейс преобразователя является единственным стандартным для XML способом преобразования объекта DOM в сериализованную форму (в данном случае String). Стандартно я имею в виду SUN Java XML API для обработки XML.

Другие альтернативы, такие как Xerces XMLSerializer или JDOM XMLOutputter, являются более прямыми методами (меньше кода), но они зависят от платформы.

На мой взгляд, способ, который вы использовали, самый элегантный и самый портативный из всех. Используя стандартный XML Java API, вы можете подключить XML-Parser или XML-Transformer по вашему выбору без изменения кода (так же, как драйверы JDBC). Есть ли что-нибудь более элегантное, чем это?

Это немного короче:

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

В противном случае вы можете использовать такую ​​библиотеку, как XMLSerializer от 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());

Мне нравится второй вариант. С JRE 1.8.0 XMLSerializer даже является частью rt.jar

Würgspaß 20.02.2018 16:39

Вы можете использовать XOM, чтобы, возможно, сделать это:

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

+1, XOM (и другие подобные библиотеки) действительно могут упростить дело.

Jonik 09.06.2009 12:11
Ответ принят как подходящий

Полагается на DOM Level3 Загрузить / сохранить:

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

Предоставляет ли Java 7 другую альтернативу?

Brian 15.06.2012 16:20

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

David Portabella 15.02.2017 11:59

Другие вопросы по теме