`
hacker_zxf
  • 浏览: 149932 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用Digest xml Rule 解析xml

    博客分类:
  • XML
阅读更多
先说大致的原理:

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问题.pdf

    在使用 Digester处理XML时,通常需要以下步骤: 1. 创建 Digester实例:`Digester digester = new Digester();` 2. 设置验证:`digester.setValidating(false);` 通常会关闭验证,除非需要严格的XML文档校验。 3. ...

    使用Apache_Commons_Digester

    1. **SAX 解析**:Digester 内部使用 SAX 来解析 XML 文件。在解析过程中,需要对 Digester 进行适当的配置,以便正确识别 XML 标签和内容。 2. **Stack**:Digester 使用 Stack(栈)数据结构来保存和检索解析...

    digester jar包大全

    这个路径被称为规则,可以使用`addRule`方法添加到Digester实例中。例如,如果XML中有`&lt;server&gt;&lt;database&gt;`这样的结构,我们可以设置规则,让Digester在遇到`&lt;database&gt;`元素时创建一个新的数据库对象,并将其添加到...

    commons-digester-2.1.jar.zip

    3. **Digest Process**:Digester解析XML文档的过程,按照规则集执行,将XML结构转化为Java对象。 ## 三、主要功能 1. **对象创建**:根据XML元素创建对应的Java对象。例如,每当解析到特定的XML标签时,可以创建...

    python3.6.5参考手册 chm

    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...

Global site tag (gtag.js) - Google Analytics