学习一下org.apache.commons.digester.Digester

    技术2022-05-19  22

     

    学习地址:

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


    最新回复(0)