有没有比这段代码更优雅的方式将 XML 文档转换为 Java 中的字符串?

Posted

技术标签:

【中文标题】有没有比这段代码更优雅的方式将 XML 文档转换为 Java 中的字符串?【英文标题】:Is there a more elegant way to convert an XML Document to a String in Java than this code? 【发布时间】:2010-09-23 20:25:45 【问题描述】:

这是当前使用的代码。

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;
        
    

【问题讨论】:

【参考方案1】:

你可以使用XOM:

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

你可以使用Jsoup:

org.jsoup.helper.W3CDom converter = new W3CDom();
String html = converter.asString( domDocument );

【讨论】:

+1,XOM(和其他类似的库)确实可以简化事情。【参考方案2】:

这更简洁一点:

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;

否则你可以使用像 Apache 的 XMLSerializer 这样的库:

//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 的一部分【参考方案3】:

依赖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);   

【讨论】:

Java 7 是否提供了另一种选择? 导入导入 org.w3c.dom.ls.DOMImplementationLS;导入 org.w3c.dom.ls.LSSerializer;【参考方案4】:

转换器 API 是从 DOM 对象转换为序列化表单(在本例中为字符串)的唯一 XML 标准方法。作为标准,我的意思是 SUN Java XML API for XML Processing。

Xerces XMLSerializer 或 JDOM XMLOutputter 等其他替代方法是更直接的方法(代码更少),但它们是特定于框架的。

在我看来,您使用的方式是最优雅和最便携的。通过使用标准 XML Java API,您可以插入您选择的 XML-Parser 或 XML-Transformer,而无需更改代码(与 JDBC 驱动程序相同)。还有什么比这更优雅的吗?

【讨论】:

以上是关于有没有比这段代码更优雅的方式将 XML 文档转换为 Java 中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Java 更优雅的方式来编写带有图像的 if 语句

有没有更优雅的方式将项目安全地添加到 Dictionary<> 中?

这段javascript代码能写得优雅吗?

更优雅的方式来处理 UIActionSheet 中的取消按钮单击?

在 php 中将 XML 文档转换为数组时,有没有办法将其转换回来并将其保存为属性为元素的 XML 文件?

将 Nokogiri 文档转换为 Ruby 哈希