【问题标题】:Java split xml fileJava拆分xml文件
【发布时间】:2023-04-02 04:20:01
【问题描述】:

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

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


{

主要问题是对于 xml 文件,我不能只拆分它,而是必须根据一个由开始 xml 标记和结束 xml 标记分隔的块来拆分它:

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

所以我不能在中间切块。因此,如果当我在一个块的一半时,我的新文件的大小大于我的最大值,我将不得不阅读直到标签的末尾,然后,开始下一个文件。

问题是我有各种各样的情况,搜索结束标记有点困难。 - 块读取文本直到结束标记的中间 - 块读取文本直到结束标记结束,之后不再有其他字符 - ETC 同时有一个循环并读取下一个块。 有时,一个块的结尾与下一个块的开头相连,我有结束 xml 标记。 我希望你能明白。

我的问题是,有没有人有一些算法可以更准确地处理所有特殊情况?

我们的想法是尽快拆分文件。 我不想用lib来把文件当作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">
 .............
 </endOfPeriodTradeNotification>
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <inventoryDate>2009-12-31</inventoryDate> 
 <!--  reporting date --> 
  <processingDate>2010-01-29T00:00:00</processingDate> 
 </myTag>

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

【问题讨论】:

  • 标签是嵌套的吗?文档中是否有多个“根”标签?
  • 没有。我有一些东西,然后是开始标签,然后是结束标签。它们里面有xml标签(不一样),在最后一个结束标签之后,还有一些东西。
  • 开始和结束标记是特定的还是可以是任何标记(由大小大于最大值时定义)?
  • 为什么要保留这些块?我的意思是生成的拆分文件无论如何都不是有效的 xml。
  • 我看不到以这种方式分割的 xml 文件格式正确的方法。如果原始 xml 大于拆分大小,那么您的拆分文件中至少有两个(第一个和最后一个)保证格式不正确。

标签: java xml


【解决方案1】:

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

使用 SAX 而不是 DOM,可以减轻您对内存的担忧,因为整个文件不会加载到内存中,但是当您的应用程序读取文件并遇到 XML 标志(例如开始和结束标签)时会发生事件。

SAX 也相当快。

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

【讨论】:

  • 我不想要,因为我不想在内存中加载一个块,因为它可能很大,但是有一个库不会将所有内容都加载到内存中,我没事。
【解决方案2】:

如果您所追求的结束标签由他们自己在线,您可以简单地做

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

代替:

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

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

如果它们本身不是行,您可以line.find(...)标签代替,拆分行,将第一部分放在当前文件中,并将第二部分保存为下一个文件。


但是,正如 cmets 中所指出的,拆分的 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>

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 2015-05-23
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多