2011-06-10 99 views
2

如何将一个长的XML文件拆分为每个预定义的不同名称?Java拆分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> 

我已经使用splits之前,只是不喜欢这里,没有开始和结束标签为整个xml。

+0

可能重复(http://stackoverflow.com/questions/5169978/split-1gb-xml-file-using-java) – 2011-06-10 11:59:55

+0

这个问题有**吨重复。搜索2分钟就能找到答案。 – 2011-06-10 12:00:10

+0

是的,但不像他们,我没有XML的开始和结束标记。 – Eve 2011-06-10 12:07:55

回答

4

我建议将它制作完好,然后使用建议的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()))); 
[拆分1GB xml文档使用Java]的
2

正如Joachim所说,这不是一个XML。

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


接听评论:

This可能会帮助您加载它。我怀疑你应该担心的大小,因为分裂它,你不得不将它加载到内存中,然后再写一遍。

然后是这样的:

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

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

最后一件事。

我会建议找到一个可行的解决方案。那么如果你对表现不满意,你可以寻找方法来优化它,或者你可以问一个性能相关的问题。

+0

我想这样做,但xml文件更大,它具有1000个“信封”,并且也包含50行。所以加入它会有点过分 – Eve 2011-06-10 12:21:02

+0

1000包络元素不是很多,实际上IMO相当少。如果你有一个1000000个信封元素,你可能会注意到它。文件有多大? – Simeon 2011-06-10 12:45:26

0

如何只读文件字符并识别<envelope></envelope>序列。只要你遇到<envelope>,你就开始捕获到缓冲区,直到达到</envelope>。这样文件可以像文件系统一样大。对大文件的XML处理是一件令人头疼的事情:-)

+0

'你头痛'是什么意思? – Simeon 2011-06-10 12:35:12

+0

@Simeon:XML解析有很大的开销,在这个例子中,输入不是格式良好的XML,所以你需要解决它。 – 2011-06-10 12:36:22

+0

This http://stackoverflow.com/questions/6204827/xml-parsing-too-slow/6205624#6205624。我已经解析了一个150MB的XML和SAX(不幸的是...),然后它花了不到5秒。 – Simeon 2011-06-10 12:46:49