我想使用SAX解析文档,并从一些元素创建一个子文档,而使用SAX处理其他元素。因此,给出这篇文档:
<DOC>
<small>
<element />
</small>
<entries>
<!-- thousands here -->
</entries>
</DOC>我想使用SAX ContentHandler解析DOC和DOC/entries元素,但是当我点击<small>时,我想创建一个只包含<small>及其子项的新文档。
有没有一种简单的方法可以做到这一点,或者我必须自己手工构建DOM?
发布于 2008-12-12 17:59:54
一种方法是创建一个ContentHandler,用于监视发出进入或退出<small>元素信号的事件。这个处理程序充当代理,在“正常”模式下将SAX事件直接传递给“真正的”ContentHandler。
但是,当检测到进入<small>元素时,代理负责创建TransformerHandler (使用无操作的“空”转换),plumbed直到DOMResult。TransformerHandler期望一个完整的、格式良好的文档所产生的所有事件;您不能立即向它发送startElement事件。相反,可以通过首先在TransformerHandler实例上调用setDocumentLocator、startDocument和其他必要事件来模拟新文档的开头。
然后,在代理检测到<small>元素的末尾之前,所有事件都将转发到此TransformerHandler,而不是“真正的”ContentHandler。当遇到结束</small>标记时,代理通过在TransformerHandler上调用endDocument来模拟文档的结尾。DOM现在作为TransformerHandler的结果可用,它只包含<small />片段。
发布于 2008-12-12 17:07:21
在我看来,答案取决于你是否需要内存中的“新文档”。如果你这样做了,那么使用DOM,或者如果你只是想流式传输“新文档”,那么StAX可能更适合SAX的事件驱动性质。
发布于 2008-12-12 18:33:47
我在一个SAX流中构建多个并发文档是没有问题的。对于任何面向业务文档的流,它几乎都是SOP。你这样做有什么困难吗?类的层次结构不必与SAX流的层次结构匹配。
https://stackoverflow.com/questions/363325
复制相似问题