我想使用SAX解析文档,并从一些元素创建一个子文档,同时纯粹使用SAX处理其他元素。所以,鉴于此文件:
<DOC>
<small>
<element />
</small>
<entries>
<!-- thousands here -->
</entries>
</DOC>
我想使用SAX ContentHandler解析DOC和DOC / entries元素,但是当我点击<small>
时,我想创建一个只包含<small>
及其子节点的新文档。
有没有一种简单的方法可以做到这一点,还是我必须自己手动构建DOM?
答案 0 :(得分:4)
一种方法是创建一个ContentHandler
来监视发出<small>
元素进入或退出的事件。此处理程序充当代理,并且在“正常”模式下将SAX事件直接传递给“真实”ContentHandler
。
但是,当检测到进入<small>
元素时,代理负责创建TransformerHandler
(使用no-op,“null”转换),plumbed最多DOMResult
。 TransformerHandler
期望完整,格式良好的文档会产生的所有事件;你无法立即发送startElement
事件。相反,首先通过在setDocumentLocator
实例上调用startDocument
,TransformerHandler
和其他必要事件来模拟新文档的开头。
然后,直到代理检测到<small>
元素元素的末尾,所有事件都转发到此TransformerHandler
而不是“真实”ContentHandler
。遇到结束</small>
标记时,代理会通过调用endDocument
上的TransformerHandler
来模拟文档的结尾。现在,TransformerHandler
可以使用DOM,其中只包含<small />
片段。
答案 1 :(得分:1)
在我看来,答案取决于你是否需要内存中的“新文件”。如果你这样做那么使用DOM,或者如果你只是要传输'新文档',那么StAX可能更适合SAX的事件驱动特性。
答案 2 :(得分:0)
我从一个SAX流中构建多个同步文档没有问题。对于任何面向业务文档的流,它都是SOP。这样做有什么困难?类的层次结构不需要与SAX流的层次结构匹配。