我有一个 Java 程序向我无法修改的 Web 服务发出请求。来自其中一个请求的响应可能非常大,如果我尝试将其解析为 Document 对象,就会达到堆内存耗尽的程度。为了解决这个问题,我将响应逐 block 读取到 byte[] 缓冲区并将其写入磁盘。然后我计划逐行扫描文件并根据我找到的每个元素构建文档对象(这些是响应中我唯一需要的元素):
StringBuilder sb = null;
String line = null;
while( (line = reader.readLine()) != null ){
if(line.trim().equals("<bond>")){
sb = new StringBuilder(line);
}
else if(line.trim().equals("</bond>")){
Document doc = builder.parse(sb.toString());
// Process doc
}
else{
sb.append(line);
}
}
不幸的是,似乎换行符在响应中被转换为空格,所以一切都是一大行。我正在考虑的一种解决方案是使用 SAX 来处理解析,并以相同的方式构建我的文档片段。有没有人有其他解决方案或者这是我最好的选择?
谢谢, 贾里德
最佳答案
在 Java 中有不同的 API 用于解析 XML 文档。您似乎正在使用 DOM API。它读取整个 XML 文档并将其转换为节点树;您会得到一个包含所有这些节点的 Document
对象。 DOM API 的优点是它相当容易使用,但缺点是如果 XML 很大,所有这些节点都会占用大量内存,正如您所注意到的。
还有 SAX API,其工作方式不同。这是通过回调机制实现的:您告诉 XML 解析器您希望在它遇到 XML 文件中的开始或结束标记或数据时被调用。然后你在你的回调方法中决定你想做什么,你只存储你需要的数据。优点是这可以扩展到大型文档,因为整个 XML 树不需要驻留在内存中。缺点是该API级别较低,使用起来比较麻烦。
还有StAX它被设计为介于 DOM 和 SAX API 之间。
如果您需要处理大型 XML 文档,最好使用 SAX 或 StAX API 而不是 DOM API。
关于java - 在 Java 中解析大型 XML 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6344341/