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(); } }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方法)与之对应