java - 在 Java 中解析大型 XML 响应

标签 java xml web-services soap

我有一个 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/

相关文章:

java - FlickR API - 基于EditText的查询

xml - 如何在xpath marklogic中传递变量中的元素名称?

javascript - 使用纯 JavaScript 进行 Soap 调用

web-services - 为什么有些 API 提供者需要 API key ?

java - 我的 Servlet、Bean 和 JSP 之间的通信问题

java - 无法正确退出或完成我的应用程序 android( Activity )

java - @Value 无需配置静态 PropertySourcesPlaceholderConfigurer 即可工作

java - 获取 com.thoughtworks.xstream.converters.ConversionException 将 xml 列表转换为 DTO

xml - 如何在 XML 站点地图中添加评论

php - 在 PHP 中使用 fopen($url) 和 curl 有什么重要区别?