您的位置:首页 > 其它

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

2011-05-20 21:23 441 查看

使用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>Title

igester类的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
http://www.pusuo.net/2009-08-18/110385090.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: