技术开发 频道

使用Apache宝石Digester改善XML处理



二、定义用于映射XML的Java

    在这个例子中,将通过Digester将一个XML文档映射成响应的Java Beans类。这个XML文档如下:

<?xml version="1.0"?> <catalog library="somewhere"> <book> <author>Author 1</author> <title>Title 1</title> </book> <book> <author>Author 2</author> <title>His One Book</title> </book> <magazine> <name>Mag Title 1</name> <article page="5"> <headline>Some Headline</headline> </article> <article page="9"> <headline>Another Headline</headline> </article> </magazine> <book> <author>Author 2</author> <title>His Other Book</title> </book> <magazine> <name>Mag Title 2</name> <article page="17"> <headline>Second Headline</headline> </article> </magazine> </catalog>
    下面让我们来定义这个XML要映射成的Java类。首先让我们从XML的根结点开始。虽然Digester并没有限制映射类的名字,但习惯上把映射类名和XML的结点名一致。而且这些类需要被声明为public。因此,根据上述规则,对应于整个XML的类是Catalog。在根结点下,有两个相同的结点:bookmagazine。这两个结点可作为addBookaddMagazine方法将这两个结点的子信息加到Catalog类中。并为这两个子结点编写两个类BookMagazineCatalog类的代码如下:

import java.util.Vector; public class Catalog { private Vector books; private Vector magazines; public Catalog() { books = new Vector(); magazines = new Vector(); } public void addBook( Book rhs ) { books.addElement( rhs ); } public void addMagazine( Magazine rhs ) { magazines.addElement( rhs ); } public String toString() { String newline = System.getProperty( "line.separator" ); StringBuffer buf = new StringBuffer(); buf.append( "--- Books ---" ).append( newline ); for( int i=0; i<books.size(); i++ ){ buf.append( books.elementAt(i) ).append( newline ); } buf.append( "--- Magazines ---" ).append( newline ); for( int i=0; i<magazines.size(); i++ ){ buf.append( magazines.elementAt(i) ).append( newline ); } return buf.toString(); } }
    在上面的Catalog类中加入了一个toString方法,用于将Book和Magazine的信息显示出来。下面我们来设计Book和Magazine类。我们从book结点可以看出,在book结点中只包含了两个子结点:author和title。而且这两个结点是最终的结点,也就是说它们除了文本信息,并不包含其他的子结点。因此我们可以将title和author设为两个属性。Book类的代码如下:

public class Book { private String author; private String title; public Book() {} public void setAuthor( String rhs ) { author = rhs; } public String getAuthor{return author;} public void setTitle( String rhs ) { title = rhs; } public String getTitle{return title;} public String toString() { return "Book: Author='" + author + "' Title='" + title + "'"; } }

    让我们再看看magazine结点。在magazine结点中,也有两个子结点:name和article。name结点和book结点的两个子结点一样,也没有子结点。因此,name结点可以作为Magazine类的一个属性存在。但article结点仍然有一个handline结点,因此,这个Article仍然需要以一个类存在。Magazine类的定义如下:

import java.util.Vector; public class Magazine { private String name; private Vector articles; public Magazine() { articles = new Vector(); } public void setName( String rhs ) { name = rhs; } public String getName(){ return name;} public void addArticle( Article a ) { articles.addElement( a ); } public String toString() { StringBuffer buf = new StringBuffer( "Magazine: Name='" + name + "' "); for( int i=0; i<articles.size(); i++ ){ buf.append( articles.elementAt(i).toString() ); } return buf.toString(); } }

下面是Article类的定义,代码如下:
public class Article { private String headline; private String page; public Article() {} public void setHeadline( String rhs ) { headline = rhs; } public String getHeadline(){return headline;} public void setPage( String rhs ) { page = rhs; } public String toString() { return "Article: Headline='" + headline + "' on page='" + page + "' "; } }
0
相关文章