|  | 级别: 初级 Brett McLaughlin (brett@newInstance.com), Enhydra 策略顾问, Lutris Technologies
2001 年 4 月 01 日 Brett McLaughlin 解释了如何使用 SAX 来与那些需要 DOM 和 JDOM 输入的应用通信。这是一个很有用的技术:随着令人激动的 XML API 的出现,开发人员现在能够很容易移来移去。样本代码提供了一个从 SAX 到 JDOM 转换的具体示例。
SAX
是最好的东西。它迅速、灵巧,而且使您听起来很酷:您是 SAX
程序员。然而其他许多人目前并不是 SAX 程序员,因为 DOM 和 JDOM
使您很容易处理某些任务。(直说吧,SAX
有时不太稳定!)让我们假设您要从正在使用的 SAX 格式中提取 XML
数据并将它们转换成其它开发人员编写程序所需的格式 -- 即,很可能是
DOM 或 JDOM。在本文中,将展示如何从 SAX 转换成 DOM 和
JDOM。然而,这在技术上是不切实际的:我实际上将解释 SAX 与 DOM 或
JDOM 是如何不同,以及如何将 SAX 与其它 API 一起使用。
从 SAX 到 DOM
首先,假定您想从 SAX 转换至
DOM。您会立刻意识到,对示例项目的描述不是很精确。因为,除非手工执行它,否则
SAX 不会将 XML
文档作为任何类型的内存中表示来存储。所以,您永远不会收到“以 SAX
格式”的 XML 文档。即,使用 SAX
构建 DOM 树是很寻常的。SAX
很迅速,所以有什么更好的方式来创建 DOM
树?您会发现,事实上,大多数语法分析器都是以某种形式使用 SAX 来创建
DOM 树。
拿 Apache Xerces 作为示例。
DOMParser 和
SAXParser 类实际上是一个单类
org.apache.xerces.framework.XMLParser
的扩展。
parse()
方法是在超类中定义的,而不是在每个子类中,这意味着在每个子类中是以相同方式进行语法分析。换句话说,当您将
parse() 方法用于 SAX 或 DOM
时,会调用相同的代码。主要的区别是
DOMParser
类会调用一个附加方法,
getDocument() ,
它在分析完成后返回 DOM 树。所以,虽然您不能明确地从 SAX “转换”到
DOM,但每次在您使用语法分析器时,它都有可能发生,只是您不知道罢了!
从 SAX 到
JDOM
从 SAX 转换到 JDOM 与从 SAX 转换到 DOM
一样,都很难表述清楚。如果说,“我将文档从 SAX 转换成
DOM”,这句话实际上是没有意义的。然而,JDOM 象 DOM 一样,可以使用
SAX 来构建一个 JDOM
Document ,就目前来讲,它被证实是最快的文档创建方式。要使用
SAX 执行这一创建,需要使用 JDOM
SAXBuilder 类。在清单
1 中显示了这个示例。
清单 1. 从 SAX 到 JDOM 的转换
// Java imports
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
// JDOM imports
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
public class SAXtoJDOM {
// XML file to read
File file;
public SAXtoJDOM(File file) {
this.file = file;
}
public Document convert() throws JDOMException, IOException {
// Create new SAXBuilder, using default parser
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new FileInputStream(file));
return doc;
}
public static void main(String[] args) {
try {
File file = new File(args[0]);
SAXtoJDOM tester = new SAXtoJDOM(file);
Document doc = tester.convert();
// Output the document to System.out
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
} |
现在您应该已经了解。从 SAX 转换成 DOM 或从 SAX 转换成 JDOM
稍微有点用词不当。但用 SAX 来构建 DOM 和 JDOM
树是非常简单的,因为它们俩都使用 SAX
这个“幌子”。有了这个提示在手,您现在已变得更加聪明,真的可以向您的朋友炫耀了!
参考资料
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 请访问
SAX
的发源地,Dave Megginson 的 SAX
页面。在那里您会找到已发布的下载、历史和一些已知的错误以及其它一些内容。
- 查找更多有关
JDOM
的内容,包括项目概述、下载和到邮件列表的链接。
- 探寻整个
DOM 世界,从 DOM
上的 W3C 页面开始。
- 在 developerWorks 下的 XML 专区,查找最近其它的提示:
关于作者  | |  |
Brett McLaughlin 是 Lutris Technologies 的 Enhydra
策略顾问和分布式系统体系结构方面的专家。他是
Java 和 XML
(O'Reilly) 的作者。他还参加了,如 Java servlet、Enterprise
JavaBeans 技术、XML 和商家对商家应用等技术的研究。他与 Jason Hunter
一起建立了 JDOM 项目,该项目为在 JAVA 应用程序中控制 XML
提供一个简单的 API。他还是 Apache Cocoon 项目和 EJBoss EJB
服务器的活跃开发人员以及 Apache Turbine 项目的共同创建者。可以通过
brett@newInstance.com
与他联系。
|
对本文的评价
|  | IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。 |