`
soft901
  • 浏览: 36828 次
  • 性别: 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
分享到:
评论

相关推荐

    digester解析XML文件实例

    这个"digester解析XML文件实例"是一个很好的学习资源,帮助开发者理解如何在实际项目中运用Digester。 首先,我们要了解Digester的基本工作原理。Digester通过定义一系列规则(Rules),当解析到XML文档中特定的...

    利用commons-digester解析xml

    为了方便地解析XML文件,Apache Commons项目提供了一个名为Digester的工具库,这就是"利用commons-digester解析xml"的主题。Apache Commons Digester是一个用于将XML文档对象映射到Java对象的框架,它通过定义一系列...

    Java_XML解析之Digester的使用

    Digester的一大优势在于它允许在运行时动态绑定,无需预先定义XML文件的DTD(文档类型定义)或Schema。 使用Digester的基本步骤如下: 1. 创建一个`Digester`实例。实例化后,它可以安全地重复使用,但需要注意的...

    扩展PlugIn插件解析XML

    本文将深入探讨如何通过接口和Digester类来解析XML文件,创建并填充Java对象。 首先,理解 Digester 类的工作原理是至关重要的。Digester 是一个规则驱动的XML解析器,它通过匹配XML文档中的模式(Pattern),执行...

    Jakarta-Common-Digester使用笔记

    我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用堆栈来保存xml节点(stack.push()方法),当该xml节点中嵌套的所有子节点解析完毕,该节点将被弹出...

    Digester的XML规则文件配置

    在Java开发中,Apache Commons Digester是一个非常实用的工具,它能够帮助开发者解析XML文件,并将其转换为Java对象模型。为了更好地利用这一工具,Digester提供了名为`org.apache.commons.digester.xmlrules`的包,...

    关于XML文档的解析方法

    Digester是基于SAX解析器构建的框架,它简化了处理XML文档的过程,通过规则匹配自动创建和填充Java对象,减少了开发者编写解析代码的工作量。 Digester最初设计用于处理Struts的配置文件,但其通用性使其成为处理...

    xml解析在java中的应用小程序

    解析完成后,可以使用`Document`对象进行节点遍历和操作,如获取元素、属性、文本内容等。 4. SAX解析在Java中的应用: SAX解析需要实现`org.xml.sax.helpers.DefaultHandler`或自定义的事件处理器。在处理事件时,...

    commons-digester-2.0.rar源文件及jar文件

    例如,XML文件中描述了一个Person对象,包含name和age属性, Digester可以通过如下方式解析: ```xml &lt;name&gt;John Doe &lt;age&gt;30 ``` 对应的Java代码可能如下: ```java Digester digester = new Digester(); ...

    digester学习笔记

    4. **解析XML**:最后,使用`digester.parse()`方法解析XML文档,完成后,栈顶的对象通常是解析结果的根节点。 在提供的示例中,有两个JavaBean,Foo和Bar。Foo有一个名为addBar的方法,用于添加Bar对象,而Bar包含...

    xml解析

    2. **SAX解析**:事件驱动的解析方式,逐行读取XML文档,当遇到元素、属性等时触发相应的回调函数。适用于处理大文件,因为它不需要一次性加载整个文档,但缺点是不能方便地回溯和修改数据。 在Java中,有多种XML...

    xml操作的例子

    在Java中,处理XML文件是一项常见的任务,本文将深入探讨Java中的XML处理技术,包括解析、创建、修改和序列化XML文档。 1. XML解析 - DOM解析:Document Object Model (DOM) 提供了完整的XML文档结构,通过DOM API...

    java操作xml相关jar

    8. **Woodstox** 和 **Aalto-XML**:这两个是高效的XML流解析器,特别适合处理大型XML文件,因为它们在内存使用和性能上都有很好的优化。 9. **Apache Commons Digester**:这个Apache项目提供了一种规则驱动的方法...

    xml 解析例子

    例如,使用DOM解析XML文件,可以按照以下步骤操作: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom....

    java xml realworld problem

    - DOM(文档对象模型)解析器:将整个XML文件加载到内存中,形成一个树形结构,方便遍历和操作。如Java的org.w3c.dom包中的DocumentBuilderFactory和DocumentBuilder。 - SAX(简单API for XML)解析器:事件驱动...

    java生成复杂xml操作

    SAX是基于事件驱动的解析器,适用于处理大型XML文件,因为它不会将整个文档加载到内存中。而StAX则允许程序按需读取或写入XML,提供了更灵活的流式处理方式。 对于更高级的XML操作,如XPath查询和XSLT转换,Java...

    xml在java中的l实例

    - 在Java中,处理XML通常涉及读取XML文档、解析其内容、操作XML节点,然后可能将修改后的数据写回XML文件。 2. **创建XML文档** - 使用`java.io.FileWriter`和`java.io.BufferedWriter`可以创建XML文件,但更常见...

    Websiteconfig

    2. **Config节点**:在XML文件中,节点是数据的基本单元,可以是元素、属性、文本、注释或处理指令。"config节点"通常指一个特定的XML元素,它是配置信息的容器,包含与应用程序运行相关的各种配置属性。 3. **依赖...

Global site tag (gtag.js) - Google Analytics