使用Jakarta Digester轻松处理和解析XML

开发者在线 Builder.com.cn 更新时间:2007-02-05作者:builder.com.cn 来源:

本文关键词: Digester Jakarta XML xml

许多时候,要解析一个XML文件,你可以编写一个解析器,用它来仔细研究XML文件,遇到不同标签采取不同的行动(SAX);或者在内存中给文件建立一个树状呈现结构,用树方法来研究树的母子关系(DOM)。虽然这两个方法都可作,但它们要么在编程方面很复杂,要么需要大量的内存或处理器资源,因而并不实用。

Jakarta Project通过其Digester组件,提供另一种解决方法:编写规则将XML元素映射到Java对象中,并为每个对象定义复杂的行动。下面我简单介绍如何用Jakarta Digester处理XML,向你说明如何应用它给XML文件建立模式匹配的规则和对得到的集合执行行动。

注:本教程假定你的系统上已正确安装和配置有Digester。欲了解下载和安装说明,请访问Jakarta Project官方网站。

基本用法

首先我们建立一个XML文件,用它作为本教程的基础实例。打开你最喜欢的文本编辑器,用列表A中的代码建立一个XML文件。

列表A

<?xml version='1.0'?>

<library>

<movie>

<title>The Matrix</title>

<rating>5</rating>

</movie>

<movie>

<title>Mission: Impossible III</title>

<rating>3</rating>

</movie>

<movie>

<title>Minority Report</title>

<rating>5</rating>

</movie>

</library>

在你开始使用Digester之前,你必须清楚了解XML结构和你将要得到的输出结果,因为你设计的类和规则集将依赖于此。因此,在第一个例子中,假定我们要执行的任务是:解析上面的XML文件,并用与它们有关的分级生成一个电影标题列表。

为实现这个目的,我们建立一些Configuration类,用它们作为保存XML数据的Java对象。(列表B

列表B

public class LibraryDetailsConfiguration{

private HashMap movieDetailsMap;

// movieDetailsMap would store the title as key and

// MovieDetailsConfiguration object as value

public LibraryDetailsConfiguration() {

movieDetailsMap = new HashMap();

}

public void setMovieDetailsMap(HashMap movieDetailsMap) {

this.movieDetailsMap = movieDetailsMap;

}

public HashMap getMovieDetailsMap() {

return movieDetailsMap;

}

public void setMovie(MovieDetailsConfiguration movieDetails) {

movieDetailsMap.put(movieDetails.getTitle(), movieDetails);

}

public void printLibraryDetails(){

Collection movieDetailsColl = this.movieDetailsMap.values();

if (movieDetailsColl != null) {

Iterator itMovieDetails = movieDetailsColl.iterator();

while(itMovieDetails.hasNext()) {

MovieDetailsConfiguration movieDetails = (MovieDetailsConfiguration)

itMovieDetails.next();

System.out.println(movieDetails.getTitle() + " -> " + movieDetails.getRating());

}

} else {

System.out.println("Movie details do not exist");

}

}

}

这个类建立一个Hashmap保存与每部电影有关的信息。对于Hashmap中的每个元素,电影标题是关键;MovieDetailsConfiguration类的一个实例保存相应的元数据(在这个例子中为分级)。这个类的代码应该相当简明:它仅包含保存和获得电影信息——如分级和标题——的标准方法。(列表C

列表C

public class MovieDetailsConfiguration{

 

private String title;

private int rating;

public MovieDetailsConfiguration() {

}

 

public void setTitle(String title) {

this.title = title;

}

 

public String getTitle() {

return title;

}

 

public void setRating(int rating) {

this.rating = rating;

}

 

public int getRating() {

return rating;

}

}

建立Configuration类后,接下来应该建立RuleSet类。RuleSet类中包含Digester将用来解析XML文件的规则集。这些规则是指Digester在解析过程中遇到一个特定的模式时,你希望它采取的行动。查看列表D中的类代码。