嵌套SAX ContentHandlers

时间:2008-12-12 16:41:59

标签: java xml dom parsing sax

我想使用SAX解析文档,并从一些元素创建一个子文档,同时纯粹使用SAX处理其他元素。所以,鉴于此文件:

  <DOC>
    <small>
      <element />
    </small>
    <entries>
      <!-- thousands here -->
    </entries>
  </DOC>

我想使用SAX ContentHandler解析DOC和DOC / entries元素,但是当我点击<small>时,我想创建一个只包含<small>及其子节点的新文档。

有没有一种简单的方法可以做到这一点,还是我必须自己手动构建DOM?

3 个答案:

答案 0 :(得分:4)

一种方法是创建一个ContentHandler来监视发出<small>元素进入或退出的事件。此处理程序充当代理,并且在“正常”模式下将SAX事件直接传递给“真实”ContentHandler

但是,当检测到进入<small>元素时,代理负责创建TransformerHandler(使用no-op,“null”转换),plumbed最多DOMResultTransformerHandler期望完整,格式良好的文档会产生的所有事件;你无法立即发送startElement事件。相反,首先通过在setDocumentLocator实例上调用startDocumentTransformerHandler和其他必要事件来模拟新文档的开头。

然后,直到代理检测到<small>元素元素的末尾,所有事件都转发到此TransformerHandler而不是“真实”ContentHandler。遇到结束</small>标记时,代理会通过调用endDocument上的TransformerHandler来模拟文档的结尾。现在,TransformerHandler可以使用DOM,其中只包含<small />片段。

答案 1 :(得分:1)

在我看来,答案取决于你是否需要内存中的“新文件”。如果你这样做那么使用DOM,或者如果你只是要传输'新文档',那么StAX可能更适合SAX的事件驱动特性。

答案 2 :(得分:0)

我从一个SAX流中构建多个同步文档没有问题。对于任何面向业务文档的流,它都是SOP。这样做有什么困难?类的层次结构不需要与SAX流的层次结构匹配。