UML软件工程组织

整合Java与XML的新应用(3)
作者:谷和启 本文选自:开放系统世界——赛迪网 2002年11月20日

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 来表达,这样确保了所有的应用程序都可以读取这些消息,整个分布式的环境更加开放。

(责任编辑 Sunny)

 



版权所有:UML软件工程组织