【问题标题】:Which is the best way to write a XML Document to a file in java?将 XML 文档写入 java 文件的最佳方法是什么?
【发布时间】:2012-04-23 23:06:58
【问题描述】:

我正在尝试编写一个 XML 文件。我能够使用以下代码创建文档。我想将此文档写入具有缩进支持的文件。目前我的代码看起来像这样。

在解析 XMl 和写入文件方面,哪种技术更好。

public void writeXmlToFile(Document dom) throws IOException {
    OutputFormat format = new OutputFormat(dom);
    format.setIndenting(true);

    XMLSerializer serializer = new XMLSerializer ( new FileOutputStream(
                                 new File("sample.xml")), format);
    serializer.serialize(dom);
}

或者使用变压器是一种更好的方法。

public void writeXMLToFile(DOcument dom) throws TransformerException, IOException {
    TransformerFactory transFact = TransformerFactory.newInstance();
    Transformer        trans = transFact.newTransformer();

    trans.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
    trans.setOutputProperty(OutputKeys.INDENT, "yes");
    trans.setOutputProeprty("{http://xml.apache.org/xslt}indent-amount", "2");

    StreamResult resut  = new StreamResult(new FileWriter(output));
    DOMSource source = new DOMSource(xmlDOC);

    trans.transform(source, result);
    writer.close();    
}

这两种方法有什么区别?哪些技术可以提供更好的性能?

【问题讨论】:

  • 假设“更好的性能”是指“使用更少的 CPU 时间”,为什么不编写一个循环来写入文件,例如,每种方法 100000 次并计算花费的时间?
  • 您使用的是哪个 XMLSerializer?它属于什么包?
  • 我正在使用 xerces 解析器 - “com.sun.org.apache.xml.internal.serialize.XMLSerializer”

标签: java xml xml-serialization transformation xerces


【解决方案1】:

为了回答您的问题,我建议第三种方式,即 W3C 提出的 DOM 加载和保存 API。代码不言自明。

DOMImplementationLS ls = (DOMImplementationLS)
    DOMImplementationRegistry.newInstance().getDOMImplementation("LS");

// Gets a basic document from string.
LSInput input = ls.createLSInput();
String xml = "<bookstore city='shanghai'><a></a><b/></bookstore>";
InputStream istream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
input.setByteStream(istream);
LSParser parser = ls.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
Document document = parser.parse(input);

// Creates a LSSerializer object and saves to file.
LSSerializer serializer = ls.createLSSerializer();
serializer.getDomConfig().setParameter("format-pretty-print", true);
LSOutput output = ls.createLSOutput();
OutputStream ostream = new FileOutputStream("c:\\temp\\foo.xml");
output.setByteStream(ostream);        
serializer.write(document, output);

与 XmlSerializer 不同,XmlSerializer 或多或少是一个预标准,这种方法是首选,因为它受到所有兼容实现的支持。不过,性能在很大程度上取决于供应商的实施。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2011-03-16
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多