当XML数据太大而无法容纳在内存中时,如何访问Java中的XML数据子集?

时间:2010-05-10 11:17:47

标签: java xml dom

我真正想要的是一个类似于StAX的流式API,有点像DOM / JDom。

这将是流媒体,因为它会非常懒惰,并且在需要之前不会读取内容。它也会流式传输它会读取所有向前(但不向后)。

以下是使用这种API的代码。

URL url = ...
XMLStream xml = XXXFactory(url.inputStream()) ;


// process each <book> element in this document.
// the <book> element may have subnodes.
// You get a DOM/JDOM like tree rooted at the next <book>.


while (xml.hasContent()) {
  XMLElement book = xml.getNextElement("book");
  processBook(book);
}

这样的事情是否存在?

2 个答案:

答案 0 :(得分:1)

解析文档的一部分而不将其完全加载到内存中的唯一方法是使用SAX解析器。

以下是有关如何使用SAX的一些官方SUN示例:http://java.sun.com/developer/codesamples/xml.html#sax

答案 1 :(得分:1)

您可以执行以下操作:

  1. 使用 SAX StAX 扫描XML文件,然后立即将所有内容整合回StringBuilder,即创建自己的XML文件副本

  2. 如果您遇到endElement并且您知道自己不需要解析的子树,请清除StringBuilder

  3. 如果您需要,可以从您创建的“副本”构建DOM树。

  4. 通过这种方式,您可以回退到标准框架,一个用于传统的SAX解析,一个用于传统的DOM构建。只有自定义的serizalization可能需要一些黑客攻击。

    如果您需要提前知道树边界,它也会有所帮助。 (在您的示例中预订元素)否则将需要进一步处理。