温馨虫窝

给自己一个温馨的家

BlogJava 首页 新随笔 联系 聚合 管理
  2 Posts :: 4 Stories :: 2 Comments :: 0 Trackbacks
在本文中,您会了解如何将 DOM 结构转换成 SAX 和 JDOM,从而可以与不使用 DOM 的应用程序通信。本文列出的代码演示了如何从 DOM 转换到供 SAX 使用的输出流,以及如何从 DOM 到 JDOM 的转换。

如果您对 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 中简单地显示了该代码,让您了解一下实际过程。

清单 2. 将 DOM 转换成 JDOM
// Java imports
import java.io.IOException;

// JDOM imports
import org.jdom.JDOMException;
import org.jdom.input.DOMBuilder; 
import org.jdom.output.XMLOutputter; 

// SAX and DOM
import org.xml.sax.InputSource;

// Xerces
import org.apache.xerces.parsers.DOMParser;

public class DOMtoJDOM {

// DOM tree of input document
org.w3c.dom.Document domDoc;

public DOMtoJDOM(String systemID) throws Exception {
DOMParser parser 
= new DOMParser();
parser.parse(
new InputSource(systemID));
domDoc 
= parser.getDocument();
}


public org.jdom.Document convert() 
throws JDOMException, IOException 
{

// Create new DOMBuilder, using default parser
DOMBuilder builder = new DOMBuilder();
org.jdom.Document jdomDoc 
= builder.build(domDoc);
return jdomDoc;
}


public static void main(String[] args) {
try {
DOMtoJDOM tester 
= new DOMtoJDOM(args[0]);
org.jdom.Document jdomDoc 
= tester.convert();

// Output the document to System.out
XMLOutputter outputter = new XMLOutputter();
outputter.output(jdomDoc, System.
out);
}
 catch (Exception e) {
e.printStackTrace();
}

}


}
 




没有别的要说了。一旦您知道如何从 DOM 移向 SAX 和 JDOM 之后,就可以解决任何您需要的输出格式并且能够处理您将遇到的许多类型的 XML 表示。静待 DOM 级别 3 规范,以了解对于以标准的且与供应商无关的方式输出 DOM 树的更改,到那时,您就可以尽情使用 DOM 了!
posted on 2005-03-01 14:45 温馨虫窝 阅读(175) 评论(0)  编辑  收藏 所属分类: XML