我试图一次用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);
答案 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。