`
soft901
  • 浏览: 36364 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics