技巧:从 DOM 转换

<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 在本文中,您会了解如何将 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 了! 参考资料 请在 Dave Megginson 的站点访问 SAX 的发源地 查找更多有关 JDOM 的内容 在 W3C 的 DOM 页面查找 DOM 的背景知识 在 developerWorks 上的 XML 专区,查找最近其它的提示: 使用 XSLT 作为到 Web 页面表内容的快捷方式 用 RDF 记录样式表 在 XSLT 中使用查找表 移动 DOM 节点(不触发 Wrong-document 异常) 用 XSLT 使用 JDOM 使用 SAX 和 SAX helper 类来实现供应商独立性 使用 SAX 来与那些需要 DOM 或 JDOM 的应用通信 关于作者 Brett McLaughlin (brett@newInstance.com) 是 Lutris Technologies 的 Enhydra 策略顾问和分布式系统体系结构方面的专家。他是 Java 和 XML (O'Reilly) 的作者。他还参加了,如 Java servlets、Enterprise JavaBeans 技术、XML 和商家对商家应用等技术的研究。他与 Jason Hunter 一起建立了 JDOM 项目,该项目为在 JAVA 应用程序中控制 XML 提供一个简单的 API。他还是 Apache Cocoon 项目和 EJBoss EJB 服务器的活跃开发人员以及 Apache Turbine 项目的共同创建者。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值