如何使用Java逐块解析大型XML文件

时间:2019-05-05 13:29:45

标签: java sax stax

我试图一次用Java解析一个大型XML文件,一次是一个块,这样服务器就不必将整个文件存储在内存中。

我的Javascript代码使用File API slice函数对文件进行切片,并一次将大约2mb发送到服务器。我正在使用AppEngine,因此无法保存到光盘。

例如,第一块:

<message:DataSet>
   <series>...</series>
   <series>...</series>
   <series>...</series> (and so on, thousands)

将2、3等大块,直到eof:

   <series>...</series>
   <series>...</series>
   <series>...</series> (more)

是否存在某种类型的解析器,可以在其中保存上下文/状态/光标,以便可以使用其他数据块恢复解析?

或者,否则,有没有一种解决方案可以解析大型XML文件而不将整个文件加载到内存中?

parser = new Parser(previousState);
parser.parse(moreData);

1 个答案:

答案 0 :(得分:1)

对于有类似要求的人,我遇到了Aalto XML处理器,这几乎就是我所追求的。它具有所谓的非阻塞(异步)XML解析功能。它将为StAX添加一个特殊事件EVENT_INCOMPLETE,该事件可以在以后输入更多输入。

例如:

<root>value</root>
AsyncXMLInputFactory inputF = new InputFactoryImpl();

//Parse part 1
byte[] input_part1 = "<root>val".getBytes("UTF-8");
AsyncXMLStreamReader<AsyncByteArrayFeeder> parser = inputF.createAsyncFor(input_part1);

//Process events here

//Parse part 2
byte[] input_part2 = "ue</root>".getBytes("UTF-8");
parser.getInputFeeder().feedInput(input_part2);

//Process more events here

更多示例here

GitHub here上的Aalto XML项目页面

更新Woodstox还具有更多功能,包括P_INPUT_PARSING_MODE,它允许更宽松的解析(例如,多个根元素)。两种解决方案均来自FasterXML。