1

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

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

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

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

4

3 回答 3

4

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

然而,当检测到进入一个<small>元素时,代理负责创建一个TransformerHandler(使用无操作,“null”转换),连接到一个DOMResult. TransformerHandler期望一个完整的、格式良好的文档会产生的所有事件;您不能立即向其发送startElement事件。相反,首先通过在实例上调用setDocumentLocatorstartDocument和其他必要事件来模拟新文档的开始。TransformerHandler

然后,直到<small>元素元素的结尾被代理检测到,所有事件都被转发到 thisTransformerHandler而不是 "real" ContentHandler。当</small>遇到结束标记时,代理通过调用endDocument. TransformerHandlerDOM 现在作为 的结果可用TransformerHandler,其中仅包含<small />片段。

于 2008-12-12T17:59:53.803 回答
1

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

于 2008-12-12T17:07:20.960 回答
0

我从一个 SAX 流中构建多个同时文档没有问题。对于任何面向业务文档的流来说,这几乎都是 SOP。你这样做有什么困难?您的类的层次结构不必与 SAX 流的层次结构相匹配。

于 2008-12-12T18:33:46.980 回答