先说大致的原理:
Digester解析XML会按照预先定义的xml规则解释。
这个规则中几个重要的节点如下:
<object-create-rule>这个标签是创建一个java实列
<set-properties-rule/>会根据解析文件的
属性调用生成类的setXXX方法,列如要解析的XML中有name,id,nextid,那么生成的类里如果有这些属性将会被调用他们的set方法。
<bean-property-setter-rule pattern="name" />会根据pattern来获取xml中标签名字,取的值,然后调用相应的bean的set方法。
<set-next-rule methodname="addStudent" />栈顶元素的下面一个元素(对象)的方法。
digester解析XML和他们大部分解析技术都一样,都用堆栈。当digester遇到一个<他会把这个元素压入堆栈,遇到/>就会把元素弹出堆栈。
1. 首先定义好对象,下面定义的对象只是测试用,无任何意义。
public class Student {
String sex;
String name;
String age;
Parent parent;
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
public class Parent {
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
import java.util.ArrayList;
import java.util.List;
public class Students {
List<Student> students;
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public void addStudent(Student student) {
students.add(student);
}
public Students() {
super();
students = new ArrayList<Student>();
}
public void sayHello() {
for (Student st : students) {
System.out.println("hello !~ " + st.getName() + " sex: " + st.getSex());
System.out.println("hello !~ parent" + st.getParent().getName());
}
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.xml.sax.SAXException;
public class Parser {
public static void main(String[] args) throws FileNotFoundException, IOException, SAXException, URISyntaxException {
URL resource = Parser.class.getResource("studentRule.xml");
URL xmlFile = Parser.class.getResource("students.xml");
Digester digester = DigesterLoader.createDigester(resource);
Students students = null;
File file = new File(xmlFile.toURI().getPath());
students = (Students) digester.parse(new FileInputStream(file));
students.sayHello();
}
}
2. 然后定义xml解析规则
<?xml version="1.0" encoding="UTF-8"?>
<digester-rules>
<pattern value="students">
<object-create-rule classname="digester.Students" />
<pattern value="student">
<!-- 创建对象 -->
<object-create-rule classname="digester.Student" />
<!-- 自动设置属性 -->
<set-properties-rule />
<!-- bean对象调用set方法的规则s -->
<bean-property-setter-rule pattern="sex" />
<bean-property-setter-rule pattern="age" />
<bean-property-setter-rule pattern="name" />
<!-- 调用 digester.Students.addStudent -->
<set-next-rule methodname="addStudent" />
<pattern value="parent">
<object-create-rule classname="digester.Parent" />
<set-properties-rule />
<bean-property-setter-rule pattern="age" />
<bean-property-setter-rule pattern="name" />
<set-next-rule methodname="setParent" />
</pattern>
</pattern>
</pattern>
</digester-rules>
3. xml文件
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student sex="F">
<name>
test1name
</name>
<age>
test1age
</age>
<parent>
<name>
test1pname
</name>
<age>
test1page
</age>
</parent>
</student>
<student sex="M">
<name>
test2name
</name>
<age>
test2age
</age>
<parent>
<name>
test2pname
</name>
<age>
test2page
</age>
</parent>
</student>
<student sex="M">
<name>
test3name
</name>
<age>
test3age
</age>
<parent>
<name>
test3pname
</name>
<age>
test3page
</age>
</parent>
</student>
</students>
参考:http://blog.csdn.net/maomao1221/archive/2006/09/04/1174903.aspx
分享到:
相关推荐
在使用 Digester处理XML时,通常需要以下步骤: 1. 创建 Digester实例:`Digester digester = new Digester();` 2. 设置验证:`digester.setValidating(false);` 通常会关闭验证,除非需要严格的XML文档校验。 3. ...
1. **SAX 解析**:Digester 内部使用 SAX 来解析 XML 文件。在解析过程中,需要对 Digester 进行适当的配置,以便正确识别 XML 标签和内容。 2. **Stack**:Digester 使用 Stack(栈)数据结构来保存和检索解析...
这个路径被称为规则,可以使用`addRule`方法添加到Digester实例中。例如,如果XML中有`<server><database>`这样的结构,我们可以设置规则,让Digester在遇到`<database>`元素时创建一个新的数据库对象,并将其添加到...
3. **Digest Process**:Digester解析XML文档的过程,按照规则集执行,将XML结构转化为Java对象。 ## 三、主要功能 1. **对象创建**:根据XML元素创建对应的Java对象。例如,每当解析到特定的XML标签时,可以创建...
xml.etree.ElementTree zlib Optimizations Build and C API Changes Deprecated Unsupported Operating Systems Deprecated Python modules, functions and methods Deprecated functions and types of the C...