Java&XML整合笔记(四)
转贴自赛迪网( http://tech.ccidnet.com/art/294/20021120/31320_4.html)
DOM 由W3C 制定,目标是提供一个可以通用于各种程序语言、操作系统和应用程序的API,所以DOM 具有极高的兼容性,不论CORBA、COM、Java、C++等都可以使用同样的DOM 接口。也因为这种跨平台的需求,DOM 在定义时就采用了CORBA 标准,因此它可以为各个语言提供完全相同的接口。
DOM 是文档对象模型。XML 将数据组织为一棵树,DOM 就是对这棵树的一个对象描述。通俗地说,就是通过解析XML 文档,为XML 文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取XML 文档的内容。
DOM 的基本对象有5个,分别是Document、Node、NodeList、Element 和 Attr。
下面举一个通过一个图形界面观察DOM 对象的例子。在Java 的标准包里有JTree 可以来表达树的概念,结合Java 的窗口JFrame ,完成一个类似于IE浏览器功能的DOM 对象查看器。
DOMTreeView.java 的源程序代码详见http://linux.ccidnet.com的期刊浏览第11期。
2.SAX 编程
SAX(Simple Application interface for XML)是一个为基于事件XML解析器定义的、可以免费获得的、与平台和语言无关的API,它允许程序和脚本动态的访问和更新文档内容、结构和风格。所以,它作为一个中间件层用来把XML文档中的数据解释成相应的Java事件。SAX这个接口规范是XML分析器和处理器提供的、较XML更底层的接口,它能提供应用以较大的灵活性。SAX是一种事件驱动的接口。它的基本原理是,由接口的用户提供符合定义的处理器,XML分析时遇到特定的事件,就去调用处理器中特定事件的处理函数。一般SAX都是Java的接口,但C++也可以用SAX接口,只是C++的分析器比较少。SAX需要用户提供以下三个处理器类的实现:
(1)DocumentHandlerXML:文件事件的处理器;
(2)DTDHandler:DTD中事件的处理器;
(3)ErrorHandler:出错处理器。
下面举一个例子,它实现了许多处理XML 文件时重要事件的ContentHandler 接口,并且说明SAX 是如何分析XML 数据的。
MySAXParser.java 的源程序代码如下(节选部分): //MySAXParser.java import java.io.IOException; import java.io.FileInputStream; import java.util.Properties; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.ErrorHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; /** * <code>SAXParser</code>可以从命令行下读入一个XML文件并且使用SAX标准的机制来分析该文件。 */ public class MySAXParser{ /** *<p> *我们将在这里使用标准的SAX的处理机制(handler)来处理XML文件 *</p> * @param uri 欲分析的XML文件的URI */ public void parseXML(String uri) { try{ System.out.println("正在分析中的XML文件: " + uri + "\n"); XMLReader parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser"); //XMLReader parser = new SAXParser(); //注册所设计的内容处理器 parser.setContentHandler(new MyContentHandler()); //注册错误处理器 parser.setErrorHandler(new MyErrorHandler()); //分析文件 parser.parse(uri); } catch(IOException ioe){ System.out.println("文件读取错误:"+ioe.getMessage()); } catch(SAXException saxe){ System.out.println("XML分析错误: "+saxe.getMessage()); } } /** *<p> *主程序使用命令列的参数来指定所要分析的XML文件 *</p> */ public static void main(String[] args) { //如果参数数目不对,则输出使用说明,并结束程序 if( args.length != 1 ){ System.out.println("请输入欲分析的文件名: " +"java example3_1 [XML URI]"); System.exit(-1); } String uri = args[0]; MySAXParser myParser = new MySAXParser(); myParser.parseXML(uri); } } /** *<code>ContentHandler</code>实做<code>org.xml.sax. *ContentHandler</code>界面,并且提供提供相关的回调方法。 *所有和XML文件内容有关的分析处理都是在这里解决。 */ class MyContentHandler implements ContentHandler { .......... .......... |
Java 与 XML ——JAXP编程应用
在许多方面,Java 语言已变成供XML 选择的一种非常适合的编程语言。在JAXP(用于XML语法分析的Java API)中包含3个软件包:
1. org.w3c.dom —W3C 推荐的用于XML 标准规划文档对象模型的Java 工具;
2. org.xml.sax—用于对XML 进行语法分析的事件驱动的简单API;
3. Javax.xml.parsers —工厂化工具,允许应用程序开发人员获得并配置特殊的语法分析器工具。
JAXP 作为Java 应用软件和XML 的公共接口,用来保证Sun 、IBM 和 Micrsoft 等公司的XML 分析程序的完全兼容性。
JAXP 是由Sun 提供的Java 的标准XML 语言开发接口,目前最高版本为1.1 。JAXP1.1包含两个部分:一个是parser 部分,位于Javax.xml.parsers 包中,负责解析XML 文档;另一个是transform(TrAX)部分,位于Java.xml.transform 包中,负责进行xslt 转换工作。
JAXP1.1 中包含3个jar 文件,分别是JAXP.jar、crimson.jar 和 xalan.jar 。JAXP.jar 提供了一系列的界面和抽象类,是开发时使用的接口;crimson.jar 中定义了实际上使用的解析器;xalan.jar 中定义了transform 处理器。
JAXP1.1 的解析器提供了SAX2 和 DOM2 支持,同时支持XML1.0 第二版,也支持名空间。JAXP1.1 的TrAX 部分提供了对Xslt 推荐标准1.0 版本的支持。
下面的例子分别是使用JAXP获得 Document Builder 建立一个DOM 对象套式文件,以及使用JAXP获得一个 SAX 语法分析器剖析一个XML 文件。
(1)DOMDemo.java 源程序代码详见http://linux.ccidnet.com的期刊浏览第11期。
(2)SAXDemo.java 源程序代码详见http://linux.ccidnet.com的期刊浏览第11期。
有关JAXB 和 JDOM 的编程,由于篇幅有限,在此就不多说了。
结合的意义
1.Java 与 XML 结合从用户使用的应用界面来说,XML 可以用来自定义用户界面。如果将Java 的图形界面Swing 技术应用以XML 的形式来设置,就可以同时发挥Java 的“write one, use many”特性。
2.Java 提供了Servlet 和 JSP (JavaServer Page) 。实际上 XML 和 Servlet、JSP 的相互结合,XML 可以成为Servlet或JSP的输出输入语言。XML 不仅提供具有意义的数据,也提供了验证的方式(DTD),使得程序能轻易地获得内容,并能够彻底地完成内容数据和表达方式的分离。
3.XML 通过Java 的JDBC与Web 数据库相结合。以XML为基础的新一代环境是直接面对Web数据的,不仅可以很好地兼容原有的Web应用,而且可以更好地实现Web中的信息共享与交换。XML可看作为一种半结构化的数据模型,很容易地将其文档描述与关系数据库中的属性一一对应起来,实施精确地查询与模型抽取。XML能增加结构和语义信息,使计算机和服务器即时处理多种形式的信息。因此,运用XML的扩展功能不仅能从Web服务器下载大量的信息,还能大大减少网络业务量。
4.XML 与 Java 的 EJB(Enterprise Java Bean) 结合。XML 在EJB 上应用,对于数据的沟通和EJB 的参数设置,使得EJB可以将自己所包含的数据依照JSP 和 Servlet 要求,以 XML 的形式返回,让JSP 和 Servlet 自行去处理和显示这些数据有关的工作。一个EJB 可能用到的参数会很多,并且很复杂,如果可以用XML 来定义一个清楚的参数表,这样就可以依据不同的需求来修改EJB 操作的方式,让工作更有效率。
5.Java 的JMS、Java/IDL(CORBA)、Java RMI 及SOAP 等各种分布式的处理,与XML 的XML-RPC 和 SOAP 都具有相似的功能。XML-RPC 和 SOAP 都是将原本是以二进制形式传递的消息,用XML 来表达,这样确保了所有的应用程序都可以读取这些消息,整个分布式的环境更加开放。