Digester解析节点含有属性的XML文件

待读取的XML文件father.xml:

<?xml version="1.0"?>
<fathers>
<father name="Tom">
<child name="Ken" age="18" sex="male"/>
<child name="Lily" age="15" sex="fmale"/>
</father>
<father name="Tyler">
<child name="Gen" age="28" sex="fmale"/>
<child name="Jim" age="15" sex="male"/>
</father>
</fathers>


father下有一个属性name,还有child元素. child有三个属性name, age, sex.

创建XML所对应的java bean, Father.java, Child.java:

public class Father {
private String name;
private Vector<Child> childs;

public Father() {
childs = new Vector<Child>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Vector<Child> getChilds() {
return childs;
}
public void setChilds(Vector<Child> childs) {
this.childs = childs;
}
public void addChild(Child child) {
this.getChilds().add(child);
}

public String toString() {
String newline = System.getProperty("line.separator");
StringBuffer buff = new StringBuffer();
if (childs != null) {
for (Child c : childs) {
buff.append("name:").append(c.getName()).append(" age:")
.append(c.getAge()).append(" Sex:").append(c.getSex())
.append(newline);
}
}

return "Father : name=" + name + newline + buff.toString();
}
}


public class Child {
private String name;
private String age;
private String sex;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}


解析这个XML文件,新建一个类SampleDigester.java:

import java.io.IOException;
import java.util.Vector;

import org.apache.commons.digester.Digester;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.SAXException;

/**
* class SampleDigester
* @author xiaoqing.yu
*/
public class SampleDigester {

/** log */
protected static final Log log = LogFactory.getLog(SampleDigester.class);

/** fathers */
private Vector<Father> fathers;

/**
* Default constructor.
*/
public SampleDigester() {
fathers = new Vector<Father>();
}

/**
* @param args
*/
public static void main(String[] args) {
SampleDigester sd = new SampleDigester();
sd.digester();
log.info(sd);
}

private void digester() {
Digester digester = new Digester();
digester.push(this);
// 当遇到<fathers>的子元素<father>时创建一个Father对象,并将其放在栈顶
digester.addObjectCreate("fathers/father", Father.class);
/*
* 根据<father>的属性(attribute),对刚创建的Father对象的属性(property)进行设置
*
* param 1: XML中所对应的节点
* param 2: 这个节点所对应的属性
* param 3: 所对应java bean中的属性
* 后面两个参数不写, 则自动匹配.
*/
digester.addSetProperties("fathers/father", "name", "name");
// 当遇到<father>的子元素<child>时创建一个Father对象,并将其放在栈顶
digester.addObjectCreate("fathers/father/child", Child.class);
// 同father节点属性设置.
digester.addSetProperties("fathers/father/child");
/* 当再次遇到<father>的子元素<child>时调用第二栈顶元素(Father对象)的addChild方法 */
digester.addSetNext("fathers/father/child", "addChild");
/* 当再次遇到<father>元素<child>时调用栈顶元素(SampleDigester对象)的addFather方法 */
digester.addSetNext("fathers/father", "addFather");

try {
digester.parse("src/test/struts/digester/demo3/father.xml");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* @return the fathers
*/
public Vector<Father> getFathers() {
return fathers;
}

/**
* @param fathers the fathers to set
*/
public void setFathers(Vector<Father> fathers) {
this.fathers = fathers;
}

/**
* addFather
* @param father
*/
public void addFather(Father father) {
this.getFathers().add(father);
}

/**
* Method toString
* @Override
*/
public String toString() {
String newline = System.getProperty("line.separator");
StringBuffer buff = new StringBuffer();
if (this.getFathers() != null) {
for(Father f : this.getFathers()) {
buff.append(newline).append(f);
}
}
return buff.toString();
}
}


打印出来的结果应该是:

Father : name=Tom
name:Ken age:18 Sex:male
name:Lily age:15 Sex:fmale

Father : name=Tyler
name:Gen age:28 Sex:fmale
name:Jim age:15 Sex:male
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值