【问题标题】:Java Split XML fileJava 拆分 XML 文件
【发布时间】:2011-09-12 10:59:57
【问题描述】:

我如何将一个长的 XML 文件拆分成多个片段,每个片段都有一个预定义的不同名称?

例如,这是我粘贴在一个长 XML 中的 XML 文件,为测试而生成。 现在我必须拆分信封,每个新文件。

<envelope>
 <tag1>1</tag1>
 <tag2>2</tag2>
 <tag3>3</tag3>
</envelope>
<envelope>
 <tag1>1</tag1>
 <tag2>2</tag2>
 <tag3>3</tag3>
</envelope>
<envelope>
 <tag1>1</tag1>
 <tag2>2</tag2>
 <tag3>3</tag3>
</envelope>

我之前已经使用过拆分,只是不像这样,整个 xml 没有开始和结束标记。

【问题讨论】:

  • Split 1GB Xml file using Java 的可能重复项
  • 这个问题有 个重复项。搜索 2 分钟就会找到答案。
  • 是的,但与他们不同的是,我没有 XML 的开始和结束标记。
  • @Eve:在这种情况下,您的输入不是 XML:XML 文档必须有一个 single 根元素。
  • 如果其他所有内容都是格式良好的 XML,那么使用添加开始和结束标签的过滤 InputStream 可能是一个很好的解决方案。

标签: java xml


【解决方案1】:

我建议使其格式正确,然后按照建议使用 SAX 或 StAX 解决方案之一。唯一的区别是我会避免将整个内容加载到内存中,而是通过 SequenceInputStream 注入开始和结束元素。

例如:

InputStream in = new SequenceInputStream(
                        // start doc
                        new ByteArrayInputStream("<root>".getBytes()),
                        new SequenceInputStream(
                           new FileInputStream("envelopes.txt"),
                           // end doc
                           new ByteArrayInputStream("</root>".getBytes())));

【讨论】:

    【解决方案2】:

    如何逐字符读取文件并识别&lt;envelope&gt;&lt;/envelope&gt; 序列。无论何时遇到&lt;envelope&gt;,您都会开始捕获到缓冲区,直到到达&lt;/envelope&gt;。这样,文件可以与文件系统允许的一样大。对大文件进行 XML 操作令人头疼:-)

    【讨论】:

    • “头痛”是什么意思?
    • @Simeon:XML 解析有很大的开销,在这个例子中输入的不是格式良好的 XML,所以你需要解决它。
    • 这个stackoverflow.com/questions/6204827/xml-parsing-too-slow/…。我已经用 SAX 解析了一个 150mb 的 XML(不幸的是......),它只用了 5 秒。
    • @ZeroPage 确实如此。那我们在讨论什么? :) OP 说'它有 1000 个“信封”'
    • 我不知道你在讨论什么,“头痛”这个词? :)
    【解决方案3】:

    正如 Joachim 所说,这不是 XML。

    您可以尝试以编程方式添加根元素,将文件另存为临时文件,然后参考other 类似问题了解如何拆分它。


    回复评论:

    This 可能会帮助您加载它。我怀疑您是否应该担心大小,因为要拆分它,无论如何您都必须将其加载到内存中然后再次写入。

    然后是这样的:

    final String xmlWithRootElement = "<root>" + IOUtils.toString(yourFile) + "</root>";
    

    应该这样做。 (没有那么多硬编码的字符串)

    最后一件事。

    我建议找到一个可行的解决方案。然后,如果您对性能不满意,您可以寻找优化方法,或者您可以提出与性能相关的问题。

    【讨论】:

    • 我想这样做,但 xml 文件要大得多,它有 1000 个“信封”,还包含 50 行。所以添加它会有点太多
    • 1000 个信封元素不是很多,实际上是相当少的 IMO。如果您有 1000000 个信封元素,您可能会注意到它。文件有多大?
    猜你喜欢
    • 2023-04-02
    • 2015-05-23
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多