使用StAX编写大量XML文件

时间:2013-06-14 12:35:02

标签: java xml stax

我有一些数据(大约150-200 MB),我需要将其转换为XML文件。我之前尝试过基于DOM的做法,但内存是一个很大的限制因素。

我开始查看StaX实现并提出一些问题。

假设我有以下代码。

  XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter("output.xml"));
  writer.writeStartDocument("  ");
  writer.writeStartElement(" ");
  writer.writeStartElement("");
  // call method X a million times
  writer.writeEndElement(" ");
  writer.flush();
  writer.close();

  // method x
  X() {
     writer.writeStartElement("  ");
     writer.writeEndElement();
  }
  1. 我假设每当执行方法X时,它会将元素写入文件。这不会将转换后的XML保留到内存中。我是对的吗?

  2. 这会像前两个开始元素一样自动关闭未关闭的标签吗?

  3. 我可以刷新编写器并再次使用同一个编写器将更多xml附加到文件中,如下所示:

    X() 
    {
        writer.writeStartElement("  ");
        writer.writeEndElement();
        writer.flush();
    }
    

2 个答案:

答案 0 :(得分:2)

  

我假设每当执行方法X时,它都会写入   元素进入文件。直到现在,这不会保留转换后的XML   记忆。我是对的吗?

StAX解析器可以在将XML写入文件之前在内存中缓冲XML的子集,以减少为提高性能而执行的磁盘I / O量。它不会缓存太多以至于内存不足。

  

这会自动关闭未关闭的标签,就像前两个开始一样   元素?

writeEndDocument方法会自动关闭所有未关闭的代码。

  

我可以刷新编写器并再次使用同一个编写器来附加一些编写器   更多xml到这个文件:

您可以继续使用相同的XMLStreamWriter将内容写入XML文件,直到您致电writeEndDocument。在编写更多内容之前,您无需显式调用flush。完成XMLStreamWriter后,您应该在其上调用close以将其释放。

答案 1 :(得分:1)

  1. 是的,但你应该在缓冲区中缓冲一些(小)写入。除了FileWriter之外,您还应该使用BufferedWriter。否则,它会进行太多的系统调用。

  2. 一旦调用writeEndElement(),它就会写入结束标记。

  3. 是的,这应该是要走的路。