使用Digester类的api进行xml解析的简单例子

本文提供了一个使用Apache Digester库的API解析XML文件的简单示例。通过示例代码展示了如何创建对象、设置属性并处理XML文档结构,以构建Java对象模型。
摘要由CSDN通过智能技术生成

使用Digester类的api进行xml解析的简单例子

2009年08月18日 18:30 来源:互联网 | 关键词:使用 digester api
使用Digester类的api进行xml解析的简单例子 
//代码如下,附件是所有源代码
部分代码如下,附件里面包含全部代码
**********************class Bar ****************
package mypackage;

/**
* <p>Titleigester类的api进行xml解析的简单例 子 </p>
*
* <p>Description:对应于xml中的<foo-catgory>下的<foo>下<bar>元素 </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author  wdz123@hotmail.com
* @version 1.0
*/
public class Bar {
private int id;
private String title;
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

private void prints(String s) {
System.out.println(" " + s);
}

public void print(String s) {
prints(s + "---Bar.id=" + id + ",Bar.title=" + title);
}
}




wdzwdz 上传了这个附件:2005-6-7 20:57
   下载次数: 553   testdigesterprj.rar (17.69 KB)
 __________________
从事 系统分析工作qq=24938558,msn=wdz123@hotmail.com我的bloghttp://blog.itpub.net/wdzwdz
package mypackage;

import java.util.*;

/**
* <p>Titleigester类的api进行xml解析的简单例子 </p>
*
* <p>Description:对应于xml中的<foo-catgory>下的<foo>元素 </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author 
wdz123@hotmail.com
* @version 1.0
*/
public class Foo {
private HashMap list;
private String name;
private int count;
public void addBar(Bar bar) {
list.put(new Integer(bar.getId()), bar);
}

public Bar findBar(int id) {
return (Bar) (list.get(new Integer(id)));
}

public Iterator getBars() {
return
list.keySet().iterator();
}

public String getName() {
return name;
}

public int getCount() {
return count;
}

public void setName(String n) {
this.name = n;
}

public void setCount(int count) {
this.count = count;
}

public Foo() {
super();
list = new HashMap();
}



public void print(){
Iterator i = getBars();
Bar b;
int c = 0;
while (i.hasNext()) {
Integer ii = (Integer) i.next();
b = findBar(ii.intValue()); 
b.print(" Bar" + c++ +"---" ;
}
}
}


__________________
从事系统分析工作qq=24938558,msn=wdz123@hotmail.com我的bloghttp://blog.itpub.net/wdzwdz
package mypackage;

import java.util.LinkedList;
import java.util.Iterator;

/**
* <p>Title: Digester类的api进行xml解析的简单例子</p>
*
* <p>Description: :对应于xml
文件中的<foo-catgory>元素 </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author  wdz123@hotmail.com
* @version 1.0
*/
public class FooCatgory {
LinkedList list = new LinkedList();

public void addFoo(Foo p) {
list.addLast(p);
}

private void prints(String s) {
System.out.println(" " + s);
}

public void print() {
prints("FooCatgory has " + list.size() + " elements" ;
int c = 0; //
Foo f;
for (Iterator i = list.iterator(); i.hasNext(); ) {
f = (Foo) i.next();
prints(" Foo" + c++ +"---" + "Foo.name=" + f.getName() + ",Foo.count=" +
f.getCount());
f.print();
}
}
}


__________________
从事系统分析工作qq=24938558,msn=wdz123@hotmail.com我的bloghttp://blog.itpub.net/wdzwdz
package mypackage;

import org.apache.commons.digester.*;

/**
* <p>Titleigester类的api进行xml解析的简单例子 </p>
*
* <p>Description: 使用Digester的api方法进行具体的解析xml文件,得到相应的java对象</p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author 
wdz123@hotmail.com
* @version 1.0
*/
public class ParseXmlFile {
public ParseXmlFile() {
super();
}

private void parse(String sFileName) {
Digester d = new Digester();
//不进行XML与相应的DTD的合法性验证,如果设置=true,那应该有对应的dtd文件,并且在xml文件指出使用的dtd文件
//digester.setValidating(false); // 

//创建根对象
FooCatgory fooCatgory = new FooCatgory(); 

//根对象进入对象栈(入栈,成为栈顶元素) 
d.push(fooCatgory); 

// 当遇到<foo>时创建一个mypackage.Foo对象,并且进入对象栈(入栈,成为栈顶元素)
d.addObjectCreate("foo-catgory/foo", mypackage.Foo.class); 

// 根据<foo>元素的属性(attribute),对刚才创建的Foo对象的属性(property)进行设置
d.addSetProperties("foo-catgory/foo"

//当再次遇到<foo>的子元素<bar>时创建一个mypackage.Bar对象,并将其放在栈顶,同时父元素(fooCatgory对象)的addFoo方法。 
d.addSetNext("foo-catgory/foo", "addFoo"

// 当遇到<bar>时创建一个mypackage.Bar对象,并将其放在栈顶(入栈,成为栈顶元素) 
d.addObjectCreate("foo-catgory/foo/bar", mypackage.Bar.class); 

// 根据<bar>元素的属性(attribute),对刚创建的Bar对象的属性(property)进行设置 
d.addSetProperties("foo-catgory/foo/bar"

//当再次遇到<bar>时创建一个mypackage.Bar对象,并将其放在栈顶,同时调用父元素(Foo对象)的addBar方法。 
d.addSetNext("foo-catgory/foo/bar", "addBar", "mypackage.Bar" ;

try {
//开始解析Xml-- foo.xml 该文件必须放到project根目录下,和目录src同级目录 
d.parse(sFileName); 
}
catch (java.io.IOException ioe) {
System.out.println("IOException reading input file:" + ioe.getMessage());
System.exit( -1);
}
catch (org.xml.sax.SAXException se) {
System.out.println("SAXException Error parsing input file:" +
se.getMessage());
System.exit( -1);
}
catch (Exception ex) {
System.out.println("Exception parse error!" + ex.getMessage());
}

//打印xml文件解析的结果
fooCatgory.print();
}

public static void main(String[] args) {
ParseXmlFile p = new ParseXmlFile();
p.parse("foo.xml" ;
}
}


__________________
从事系统分析工作qq=24938558,msn=wdz123@hotmail.com我的bloghttp://blog.itpub.net/wdzwdz
<foo-catgory>
<foo name="foo1" count="10">
<bar id="1" title="The First Child"/>
<bar id="2" title="The Second Child"/>
</foo>

<foo name="foo2" count="20">
<bar id="3" title="foo2 The First Child"/>
<bar id="4" title="f002 The Second Child"/>
</foo>
</foo-catgory>


__________________
从事系统分析工作qq=24938558,msn=wdz123@hotmail.com我的bloghttp://blog.itpub.net/wdzwdz

具体内容参考

http://www.itpub.net/376970.html

or

http://dev2dev.bea.com.cn/bbs/th ... =23765&tstart=0


__________________
从事系统分析工作qq=24938558,msn=wdz123@hotmail.com我的bloghttp://blog.itpub.net/wdzwdz
------xml_parse_rule.xml xml规则文件-----------------------
<?xml version="1.0"?>
<!DOCTYPE digester-rules PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN" "http://jakarta.apache.org/commons/digester/dtds/digester-rules.dtd">
<digester-rules>
        <pattern value="foo-catgory">
                <object-create-rule classname="mypackage.FooCatgory"/>        
                <pattern value="foo">
                        <object-create-rule classname="mypackage.Foo"/>
                              <set-properties-rule/>
                        <set-next-rule methodname="addFoo"/>
                        <pattern value="bar">
                                <object-create-rule classname="mypackage.Bar"/>                                
                                      <set-properties-rule/>
                                <set-next-rule methodname="addBar"/>
                        </pattern>
                </pattern>
        </pattern>
</digester-rules>
------------------------------------------------------
package mypackage;

import org.apache.commons.digester.*;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.xml.sax.InputSource;


/**
* <p>Titleigester类的api进行xml解析的简单例子 </p>
*
* <p>Description: 使用Digester的xml规则(xml规则文件给出解析时候回调接口的设置)
* 进行具体的解析xml文件,得到相应的java对象</p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author 
wdz123@hotmail.com
* @version 1.0
*/
public class UseXmlRuleParseXml {
  public UseXmlRuleParseXml() {
    super();
  }

  private void parse(String sFileName, String sXmlRuleFile) {
    Digester d = null;
    try {
      //使用这个文件sXmlRuleFile来代替 mypackage.ParseXmlFile的  private void parse(String sFileName) 方法中关于规则的设置
      InputSource in = new InputSource(sXmlRuleFile);
      in.setEncoding("gbk" ;
      d = DigesterLoader.createDigester(in);
    }
    catch (Exception ex) {
      System.err.println("不能找到xml规则文件,---" + ex.getMessage());
      System.exit( -1);
    }

    //创建根对象
    FooCatgory fooCatgory = null;
    try {
      //开始解析Xml
      fooCatgory = (FooCatgory) d.parse(sFileName);
    }
    catch (java.io.IOException ioe) {
      System.out.println("IOException reading input file:" + ioe.getMessage());
      System.exit( -1);
    }
    catch (org.xml.sax.SAXException se) {
      System.out.println("SAXException Error parsing input file:" +
                         se.getMessage());
      System.exit( -1);
    }
    catch (Exception ex) {
      System.out.println("Exception  parse error!" + ex.getMessage());
    }

    //打印xml文件解析的结果
    fooCatgory.print();
  }

  public static void main(String[] args) {
    UseXmlRuleParseXml p = new UseXmlRuleParseXml();
    System.out.println(" use Digester rule xml文件来社解析规则 " ;
    /// xml_parse_rule.xml  该文件必须放到project根目录下,和目录src同级目录
    /// foo.xml 该文件必须放到project根目录下,和目录src同级目录
    p.parse("foo.xml", "xml_parse_rule.xml" ;
  }
}


__________________
从事系统分析工作qq=24938558,msn=wdz123@hotmail.com我的bloghttp://blog.itpub.net/wdzwdz
本来digester我算是有一定了解了,可是我还是倒回来再总结一下,因为,这个包在很多
开源框架,开源包里面都有使用到,比如:struts。所以深入了解它的结构原理,可以更好的理解开源框架的组织方式。
一般的java配置信息都是采用xml格式来保存的,当然也有采用普通文件保存的,比如采用  java.util.Properties按照键值对来保存的,但是这样的保存格式只能表达比较简单的配置信息;而采用xml格式可以表达比较复杂的配置信息以及它们之间复杂的关联关系。
系统为了从xml中获得配置信息,可以采用dom,jdom,dom4j,sax等方式来解析文件,从而获得配置信息;但是采用这几种接口来分析文件,它们的抽象程度不够,编程繁琐;而采用jakarta commons  digester 来处理相对没有繁琐。
commons digester采用类似sax基于事件的解析方式,程序可以向解析器注册事件回调接口, sax解析器遇到相应xml标志(元素),时候调用的这些接口。当整个xml解析完成后,根据回调接口进行处理后,返回一个或者多个对象给使用者。从而最终达到根据xml文件生成对象的目的,然后使用者可以在基于对象的基础上进行相应处理。
采用commons digester进行xml解析的简单例子:
http://www.itpub.net/374832.html (我自己的例子) 或者
    http://www.javajia.com/article.php?id=948 (别人的例子)
     上面的例子中实际上是以编程的方式来设置xml的解析时候的回调接口,例如 http://blog.itpub.net/post/197/32090 中的class ParseXmlFile就是private void parse(String sFileName)方法就是实现了回调接口的设置。
     当然,commons digester另外还提供了更高一层的处理方式,就是采用使用xml文件方式来给出回调接口,这样以上面的例子来说,可以private void parse(String sFileName)方法中绝大部分代码省去。
     参考 类  mypackage.UseXmlRuleParseXml
xml规则文件例子xml_parse_rule.xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值