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

 

学习地址:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值