待读取的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。 首先,我们要了解Digester的基本工作原理。Digester通过定义一系列规则(Rules),当解析到XML文档中特定的...
为了方便地解析XML文件,Apache Commons项目提供了一个名为Digester的工具库,这就是"利用commons-digester解析xml"的主题。Apache Commons Digester是一个用于将XML文档对象映射到Java对象的框架,它通过定义一系列...
Digester的一大优势在于它允许在运行时动态绑定,无需预先定义XML文件的DTD(文档类型定义)或Schema。 使用Digester的基本步骤如下: 1. 创建一个`Digester`实例。实例化后,它可以安全地重复使用,但需要注意的...
本文将深入探讨如何通过接口和Digester类来解析XML文件,创建并填充Java对象。 首先,理解 Digester 类的工作原理是至关重要的。Digester 是一个规则驱动的XML解析器,它通过匹配XML文档中的模式(Pattern),执行...
我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用堆栈来保存xml节点(stack.push()方法),当该xml节点中嵌套的所有子节点解析完毕,该节点将被弹出...
在Java开发中,Apache Commons Digester是一个非常实用的工具,它能够帮助开发者解析XML文件,并将其转换为Java对象模型。为了更好地利用这一工具,Digester提供了名为`org.apache.commons.digester.xmlrules`的包,...
Digester是基于SAX解析器构建的框架,它简化了处理XML文档的过程,通过规则匹配自动创建和填充Java对象,减少了开发者编写解析代码的工作量。 Digester最初设计用于处理Struts的配置文件,但其通用性使其成为处理...
解析完成后,可以使用`Document`对象进行节点遍历和操作,如获取元素、属性、文本内容等。 4. SAX解析在Java中的应用: SAX解析需要实现`org.xml.sax.helpers.DefaultHandler`或自定义的事件处理器。在处理事件时,...
例如,XML文件中描述了一个Person对象,包含name和age属性, Digester可以通过如下方式解析: ```xml <name>John Doe <age>30 ``` 对应的Java代码可能如下: ```java Digester digester = new Digester(); ...
4. **解析XML**:最后,使用`digester.parse()`方法解析XML文档,完成后,栈顶的对象通常是解析结果的根节点。 在提供的示例中,有两个JavaBean,Foo和Bar。Foo有一个名为addBar的方法,用于添加Bar对象,而Bar包含...
2. **SAX解析**:事件驱动的解析方式,逐行读取XML文档,当遇到元素、属性等时触发相应的回调函数。适用于处理大文件,因为它不需要一次性加载整个文档,但缺点是不能方便地回溯和修改数据。 在Java中,有多种XML...
在Java中,处理XML文件是一项常见的任务,本文将深入探讨Java中的XML处理技术,包括解析、创建、修改和序列化XML文档。 1. XML解析 - DOM解析:Document Object Model (DOM) 提供了完整的XML文档结构,通过DOM API...
8. **Woodstox** 和 **Aalto-XML**:这两个是高效的XML流解析器,特别适合处理大型XML文件,因为它们在内存使用和性能上都有很好的优化。 9. **Apache Commons Digester**:这个Apache项目提供了一种规则驱动的方法...
例如,使用DOM解析XML文件,可以按照以下步骤操作: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom....
- DOM(文档对象模型)解析器:将整个XML文件加载到内存中,形成一个树形结构,方便遍历和操作。如Java的org.w3c.dom包中的DocumentBuilderFactory和DocumentBuilder。 - SAX(简单API for XML)解析器:事件驱动...
SAX是基于事件驱动的解析器,适用于处理大型XML文件,因为它不会将整个文档加载到内存中。而StAX则允许程序按需读取或写入XML,提供了更灵活的流式处理方式。 对于更高级的XML操作,如XPath查询和XSLT转换,Java...
- 在Java中,处理XML通常涉及读取XML文档、解析其内容、操作XML节点,然后可能将修改后的数据写回XML文件。 2. **创建XML文档** - 使用`java.io.FileWriter`和`java.io.BufferedWriter`可以创建XML文件,但更常见...
2. **Config节点**:在XML文件中,节点是数据的基本单元,可以是元素、属性、文本、注释或处理指令。"config节点"通常指一个特定的XML元素,它是配置信息的容器,包含与应用程序运行相关的各种配置属性。 3. **依赖...