Java Split XML文件

时间:2011-06-10 11:58:11

标签: java xml

如何将长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没有开始和结束标记。

3 个答案:

答案 0 :(得分:4)

我建议使其成型良好,然后按照建议使用SAX或StAX解决方案之一。唯一的区别是我会避免将整个内容加载到内存中,而是通过SequenceInputStream注入start和end元素。

例如:

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

答案 1 :(得分:2)

正如约阿希姆所说,这不是一个XML。

您可以尝试以编程方式添加根元素,将文件另存为某个地方,然后参考other类似的问题来解决它。


回答评论:

This可能会帮助您加载它。我怀疑你应该担心它的大小,因为要拆分它你必须把它加载到内存中然后再写它。

然后像:

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

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

最后一件事。

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

答案 2 :(得分:0)

如何逐个阅读文件并识别<envelope></envelope>序列。每当遇到<envelope>时,您都会开始捕获缓冲区,直至到达</envelope>。这样文件就可以像文件系统允许的那样大。对大文件的XML操作很令人头疼: - )