技巧:从 DOM 转换 (1)
[ 来源:互网络 | 更新日期:2007-09-30 19:27:22 | 浏览次数:13214]
简介:apache
如果您对 W3C 的 DOM(文档对象模型)感兴趣而且认为 SAX 很灵巧的话,那么您必须找出一种方法将 DOM 转换成应用程序开发人员使用的其它格式。当然,这些其它格式是指 SAX 和 JDOM。如果必须将 DOM 作为输入且要将它转换成其它格式时,要做什么?这当然是一个值得研究的问题。由于 DOM 提供了完整的文档表示,将它转换成另外一种格式当然是可行的。在本文中,您将了解如何执行从 DOM 到 SAX 或 JDOM 的转换。
从 DOM 到 SAX
遗憾的是,DOM 级别 1 和更新的级别 2 没有提供将 DOM 树输出成 SAX 或其它格式的方式。结果是每个语法分析器实现都提供了一组用于输出的定制 API,实现的独立性丧失了。换句话说,您的代码只能与那个为它编写的语法分析器一起工作(如 Crimson、Xerces 或 Oracle 等等)。DOM 级别 3 被认为是提供了这项功能,所以我们都必须静观 DOM 级别 3 能提供什么输出方法。同时,查看一下供应商提供的有关编写或串行化 DOM 树的文档。例如使用 Apache Xerces,需要使用如清单 1 中所示的 org.apache.xml.serialize.XMLSerializer 类。 在每一种情形,您将有可能必须以流的形式输出 DOM 树,然后将这个流交给 SAX 进行后续处理。请注意,清单 1 中仅显示了以流的形式输出 DOM 树;然后可以使用这个流作为 SAX 处理器的输入。
清单 1. 将 DOM 转换成输出流(供 SAX 使用)
import org.apache.xerces.parsers.DOMParser;
import org.apache.xml.serialize.XMLSerializer;
import org.xml.sax.InputSource;
import org.w3c.dom.Document;
public class PrintDOMTree {
public static void main(String[] args) {
try {
InputSource source = new InputSource(args[0]);
DOMParser parser = new DOMParser();
parser.parse(source);
Document doc = parser.getDocument();
XMLSerializer serializer = new XMLSerializer();
// Insert your PipedOutputStream here instead of System.out!
serializer.setOutputByteStream(System.out);
serializer.serialize(doc);
} catch (Exception e) {
e.printStackTrace();
}
}
}
从 DOM 到 JDOM
将 DOM 转换成 JDOM 要比将 DOM 转换成 SAX 简单。这事实上很有意义,因为您一旦有了 DOM 树,就有可能有机会从 SAX 处理数据。事实上,很少有 SAX 最优处理 DOM 树的情况,因为您通过 DOM 表示来将 XML 存储在内存里时,已经用尽了内存。更为常见的工作是把作为 DOM 树的 XML 文档转换成 JDOM 树。由于这些格式都是文档表示,但在行为和功能性方面有潜在的不同,所以您可能想让其他人用您的 DOM 树并将它当作 JDOM 进行处理。您可能认为这是他们的工作,但您需要知道(至少!)如何从您的结构转换成他们的结构。
对于将 DOM 转换成 JDOM,JDOM API 向用户提供了 DOM Node,称为 org.jdom.input.DOMBuilder。这个类接受 DOM Document(以及其它一些 DOM 结构,如 Element 和 Attr),并将 DOM 树转换成 JDOM Document。这个操作并不复杂,所以我在清单 2 中简单地显示了该代码,让您了解一下实际过程。


您的位置:
