学习地址:
http://onjava.com/pub/a/onjava/2002/10/23/digester.html?page=1
The Example Document and Beans
In this example, we will unmarshall the same XML document that we used in the previous article:
<?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>
我们设计这些java类的时候也要和xml文件中的节点一一对应,每个对象的非集合属性都要设计一个set方法,
每一个集合属性都要在类中有一个向集合中添加对象的方法,参数是类的集合类的类型,集合中的类的标签要在当前类子标签中,
属性也要在集合的的子标签中或是在类的标签中。
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();
}
}
public class Book {
private String author;
private String title;
public Book() {}
public void setAuthor( String rhs ) { author = rhs; }
public void setTitle( String rhs ) { title = rhs; }
public String toString() {
return "Book: Author='" + author + "' Title='" + title + "'";
}
}
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 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();
}
}
public class Article {
private String headline;
private String page;
public Article() {}
public void setHeadline( String rhs ) { headline = rhs; }
public void setPage( String rhs ) { page = rhs; }
public String toString() {
return "Article: Headline='" + headline + "' on page='" + page + "' ";
}
}
import org.apache.commons.digester.*;
import java.io.*;
import java.util.*;
public class DigesterDriver {
public static void main( String[] args ) {
try {
Digester digester = new Digester();
//对xml文档是否进行DTD验证,格式是否正确。
digester.setValidating( false );
//产生一个Catalog对象,遇到一个catalog节点
digester.addObjectCreate( "catalog", Catalog.class );
//遇到catalog节点下的book节点,产生一个Book对象
digester.addObjectCreate( "catalog/book", Book.class );
//设置属性,属性的set方法。
digester.addBeanPropertySetter( "catalog/book/author", "author" );
digester.addBeanPropertySetter( "catalog/book/title", "title" );
//执行Catalog类中的addBook方法
digester.addSetNext( "catalog/book", "addBook" );
digester.addObjectCreate( "catalog/magazine", Magazine.class );
digester.addBeanPropertySetter( "catalog/magazine/name", "name" );
digester.addObjectCreate( "catalog/magazine/article", Article.class );
//设置对应名称的属性,执行set方法。
digester.addSetProperties( "catalog/magazine/article", "page", "page" );
digester.addBeanPropertySetter( "catalog/magazine/article/headline" );
//执行Magazine类中的addArticle方法,参数
digester.addSetNext( "catalog/magazine/article", "addArticle" );
//执行catalog类中的addMagazine方法
digester.addSetNext( "catalog/magazine", "addMagazine" );
File input = new File( args[0] );
//读取xml文件
Catalog c = (Catalog)digester.parse( input );
System.out.println( c.toString() );
} catch( Exception exc ) {
exc.printStackTrace();
}
}
}
<?xml version="1.0"?>
<digester-rules>
<object-create-rule pattern="catalog" classname="Catalog" />
<set-properties-rule pattern="catalog" >
<alias attr-name="library" prop-name="library" />
</set-properties-rule>
<pattern value="catalog/book">
<object-create-rule classname="Book" />
<call-method-rule pattern="author" methodname="setAuthor"
paramcount="0" />
<call-method-rule pattern="title" methodname="setTitle"
paramcount="0" />
<set-next-rule methodname="addBook" />
</pattern>
<pattern value="catalog/magazine">
<object-create-rule classname="Magazine" />
<call-method-rule pattern="name" methodname="setName" paramcount="0" />
<pattern value="article">
<object-create-rule classname="Article" />
<set-properties-rule>
<alias attr-name="page" prop-name="page" />
</set-properties-rule>
<call-method-rule pattern="headline" methodname="setHeadline"
paramcount="0" />
<set-next-rule methodname="addArticle" />
</pattern>
<set-next-rule methodname="addMagazine" />
</pattern>
</digester-rules>
import org.apache.commons.digester.*;
import org.apache.commons.digester.xmlrules.*;
import java.io.*;
import java.util.*;
public class XmlRulesDriver {
public static void main( String[] args ) {
try {
File input = new File( args[0] );
File rules = new File( args[1] );
Digester digester = DigesterLoader.createDigester( rules.toURL() );
Catalog catalog = (Catalog)digester.parse( input );
System.out.println( catalog.toString() );
} catch( Exception exc ) {
exc.printStackTrace();
}
}
}
digester.push(Object); // 将对象压入堆栈中
parseXml.parse("file://D://XX.xml");// 文件指定格式digester的文件指定格式,
以file开头也就是在路径前要加入file前缀,这和spring中解析文件资源的用法类似可以参考它。
我这里有一段已经成功运用于我做的项目的一段解析xml的代码,希望对你有用
public synchronized void getObjectSettings(HttpServletRequest request, String fileName, String pageId) throws Exception {
Digester digester = new Digester();
digester.push(this);
digester.setValidating(false);
digester.addObjectCreate("ObjectPageSettings/"+pageId+"/pageinfo", "jp.co.toshiba.kjap.business.object.bean.ObjPageSettingsBean");//设置读取pageinfo属性对应的bean
digester.addSetProperties("ObjectPageSettings/"+pageId+"/pageinfo");
digester.addSetNext("ObjectPageSettings/"+pageId+"/pageinfo", "setPageinfo");
try {
digester.parse(request.getRealPath("/WEB-INF/")+"/"+fileName);
}
catch(java.io.IOException ioe) {
System.out.println("XML读取错误:" + ioe.getMessage());
return;
}
catch(org.xml.sax.SAXException se) {
System.out.println("XML解析错误:" + se.getMessage());
return;
}
}
在WEB-INF下面有一个文件名为ObjectPageSettings.xml内容如下:
<ObjectPageSettings>
<Obj030100>
<pageinfo pageId="Obj030100" eachPageCount="100" >
</pageinfo>
</Obj030100>
<Obj030203>
<pageinfo pageId="Obj030203" eachPageCount="10" >
</pageinfo>
</Obj030203>
<Obj030202>
<pageinfo pageId="Obj030202" eachPageCount="10" >
</pageinfo>
</Obj030202>
<Obj030105>
<pageinfo pageId="Obj030105" eachPageCount="100" >
</pageinfo>
</Obj030105>
</ObjectPageSettings>
函数使用方法:
getObjectSettings(request,"ObjectSettings.xml","Obj030202");
第一个是request对象,ObjectSettings.xml为WEB-INF下面的文件名,Obj030202为需要读取的属性,注意,xml中的pageinfo要有对应的bean(jp.co.toshiba.kjap.business.object.bean.ObjPageSettingsBean中提供了pageId,eachPageCount的set和get方法)与之对应