Java拆分xml文件

时间:2010-05-11 12:56:10

标签: java xml

我正在编写一段代码来分割文件。 我想分割平面文件(没关系,它工作正常)和xml文件。 我们的想法是根据一些文件进行拆分: 我有一个文件,我想将其拆分为x文件(x是参数)。 我正在通过获取文件的大小并将大小分割为要拆分的文件数来进行拆分。 然后,mysolution使用BufferedReader并像

一样使用它
while ((n = reader.read(buffer, 0, buffer.length)) != -1) {


{

主要问题是对于xml文件我不能只拆分它,但是我必须根据start xml标记和end xml标记分隔的块来拆分它:

<start tag>
bla bla xml stuff
</end tag>

所以我不能在中间切块。因此,如果当我处于块的一半时,我的新文件的大小是否大于我的最大值,我将必须读取直到标记的结尾,然后,开始下一个文件。

问题在于我有各种各样的情况,并且搜索结束标记有点困难。 - 块读取文本直到结束标记的中间 - 块读取文本直到结束标记结束,之后没有其他标记 - 等等 并在同一时间有一个循环并读取下一个块。 有时候块的结尾与下一个块的开头连接,我有结束的xml标签。 我希望你明白这一点。

我的问题是,是否有人使用某种算法来更准确地处理所有特殊情况?

我们的想法是尽快拆分文件。 我不想使用lib将文件视为xml文件,因为块的大小可能更小或非常大,我不知道内存是否足够。或者有一些lib没有加载到内存中?

非常感谢。

下面是我的xml文件示例;

<?xml version="1.0" encoding="UTF-8" ?> 
 <myTag service="toto" version="1.5.18" >
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <inventoryDate>2009-12-31</inventoryDate> 
 <!--  reporting date --> 
  <processingDate>2010-01-29T00:00:00</processingDate> 
 </myTag>

我忘了一件事:我的xml文件可以写在第一行, 所以我不能指出一行有一个标签。

3 个答案:

答案 0 :(得分:1)

尽管您已声明不希望使用将其视为XML文件的库。您可能需要考虑使用SAX。

使用SAX而不是DOM,可以消除对内存的恐惧,因为整个文件没有加载到内存中,但是当应用程序读取文件并遇到XML标记(如开始和结束标记)时会发生事件。

SAX也很快。

本快速入门指南应该有所帮助:http://www.saxproject.org/quickstart.html

答案 1 :(得分:0)

如果您所追求的结束标记由他们自己在线上,您可以简单地执行

String line;
while ((line = reader.readLine()) != null)

而不是:

while ((n = reader.read(buffer, 0, buffer.length)) != -1)

然后只要line匹配结束标记并且当前文件足够大,就会拆分成新文件。

如果它们不是自己的行,则可以line.find(...)标记,拆分行,将第一部分放在当前文件中,然后将第二部分保存到下一个文件中。


但是,正如评论中指出的那样,分割的xml文件将远离有效的xml,除非你要处理一些事情。例如,第一部分可能看起来像:

<?xml version="1.0" encoding="UTF-8" ?> 
 <myTag service="toto" version="1.5.18" >
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <endOfPeriodTradeNotification  version="1.5.18">

并且这不是有效的xml。

  <inventoryDate>2009-12-31</inventoryDate> 
  <!--  reporting date --> 
  <processingDate>2010-01-29T00:00:00</processingDate> 
 </myTag>

答案 2 :(得分:0)

分割xml文件的最佳工具是vtd-xml。它不仅速度超快,而且编写应用程序也非常容易,例如使用xpath。