Digester解析xml文档

来源:互联网 发布:mac转换视频格式软件 编辑:程序博客网 时间:2024/05/16 19:00
 

依赖apache的四个包:

commons-digester-2.1.jar

commons-logging-1.1.1.jar

commons-beanutils-1.8.3.jar

commons-collections-3.2.1.jar

用到类Digester、DigesterLoader等,引入commons-digester-2.1.jar

用到类Log、LogFactory等,引入commons-logging-1.1.1.jar

用到类DynaProperty等,引入commons-beanutils-1.8.3.jar

至于commons-collections-3.2.1.jar,在以下所示实例中,不引入也可以,还没有涉及到这个包,在以后的应用的,根据具体情况确定是否引入。

1. 直接解析

两个实体类User、Address;一个xml文件;一个解析类ParseXml

关键点参考注释

User.java

public class User

{

private String name;

private String password;

private Address address;// 地址对象作为User的一个属性

public String getName()

{

return name;

}

public void setName(String name)

{

this.name = name;

}

public String getPassword()

{

return password;

}

public void setPassword(String password)

{

this.password = password;

}

public Address getAddress()

{

return address;

}

public void setAddress(Address address)

{

this.address = address;

}

}

Address.java

public class Address

{

private String province;

private String city;

private String town;

public String getProvince()

{

return province;

}

public void setProvince(String province)

{

this.province = province;

}

public String getCity()

{

return city;

}

public void setCity(String city)

{

this.city = city;

}

public String getTown()

{

return town;

}

public void setTown(String town)

{

this.town = town;

}

}

user.xml

<?xml version='1.0' encoding='utf-8'?>

<user><!—User对象作为根结点 -->

<name>张三</name><!-- User的属性 -->

<password>password</password><!-- User的属性 -->

<address><!-- address对象作为User的属性 -->

<province>河北</province><!-- Address的属性 -->

<city>承德</city><!-- Address的属性 -->

<town>围场</town><!-- Address的属性 -->

</address>

</user>

ParseXml.java

import java.io.File;

import java.io.IOException;

import org.apache.commons.digester.Digester;

import org.xml.sax.SAXException;

import bean.Address;

import bean.User;

public class ParseXml

{

public void parseByDigester(File file) throws IOException, SAXException

{

Digester digester = new Digester();

// 将User压栈

digester.push(new User());

// 设置属性

digester.addBeanPropertySetter("user/name");

digester.addBeanPropertySetter("user/password");

// 将Address压栈

digester.addObjectCreate("user/address", Address.class);

// 设置Address的属性

digester.addBeanPropertySetter("user/address/province");

digester.addBeanPropertySetter("user/address/city", "city");

digester.addBeanPropertySetter("user/address/town", "town");

// 调用User的setAddress方法,得到Address对象

digester.addSetNext("user/address", "setAddress");

// 开始解析,得到User对象

User user = (User) digester.parse(file);

// System.out.println(user);

}

public static void main(String[] args) throws IOException, SAXException

{

String file = "\\src\\user.xml";

String root = System.getProperty("user.dir");

// user.xml文件路径

String finaladdr = root + file;

new ParseXml().parseByDigester(new File(finaladdr));

}

}

2. 通过设置模板规则来解析

五个实体类:Root、Models、Model、Book、Magazine

其中Models是Root的属性,Model是Models的属性,Book、Magazine是Model的属性。

两个xml文件,config.xml是模板文件,input.xml是符合模板规则的待解析文件。

一个解析类Test

关键点参考注释

Root.java

import java.util.Vector;

public class Root

{

// Models对象作为Root的属性

private Vector<Models> models = new Vector<Models>();

public Vector<Models> getModels() {

return models;

}

public void setModels(Vector<Models> models) {

this.models = models;

}

// 得到Models集合,此方法需要在模板文件中配置

public void addModels(Models obj) {

models.addElement(obj);

setModels(this.models);

}

}

Models.java

import java.util.Vector;

public class Models

{

// Model对象作为Models的属性

private Vector<Model> models = new Vector<Model>();

public Vector<Model> getModels() {

return models;

}

public void setModels(Vector<Model> models) {

this.models = models;

}

// 得到Model集合,此方法需要在模板文件中配置

public void addModel(Model obj) {

models.addElement(obj);

setModels(this.models);

}

} Model.java

import java.util.Vector;

public class Model

{

private String id;

private String name;

// Book对象作为Model的属性

private Vector<Book> books = new Vector<Book>();

// Magazine对象作为Model的属性

private Vector<Magazine> magazines = new Vector<Magazine>();

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Vector<Book> getBooks() {

return books;

}

public void setBooks(Vector<Book> books) {

this.books = books;

}

public Vector<Magazine> getMagazines() {

return magazines;

} public void setMagazines(Vector<Magazine> magazines) {

this.magazines = magazines;

}

// 得到Book集合,此方法需要在模板文件中配置

public void addBook(Book obj) {

books.addElement(obj);

setBooks(this.books);

}

// 得到Magazine集合,此方法需要在模板文件中配置

public void addMagazine(Magazine obj) {

magazines.addElement(obj);

setMagazines(this.magazines);

}

}

Book.java

public class Book

{

private String id;

private String name;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

Magazine.java

public class Magazine

{

private String id;

private String name;

private String time;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTime() {

return time;

}

public void setTime(String time) {

this.time = time;

}

} config.xml

<?xml version="1.0" encoding="UTF-8"?>

<digester-rules>

<pattern value="root"> <!-- root作为根结点 -->

<object-create-rule classname="bean.Root" /> <!-- 根结点对应的类 -->

</pattern>

<pattern value="root/models"> <!-- models为root的子结点 -->

<object-create-rule classname="bean.Models" /> <!-- models子结点对应的类 -->

<set-next-rule methodname="addModels" /> <!-- Root中的方法addModels,得到Models集合 -->

</pattern>

<pattern value="root/models/model">

<object-create-rule classname="bean.Model" /> <!-- model子结点对应的类 -->

<set-properties-rule >

<alias attr-name="id" prop-name="id" /> <!-- 子结点model的属性 -->

<alias attr-name="name" prop-name="name" /> <!-- 子结点model的属性 -->

</set-properties-rule>

<set-next-rule methodname="addModel" /> <!-- Models中的方法addModel,得到Model集合 -->

</pattern>

<pattern value="root/models/model/book">

<object-create-rule classname="bean.Book" /> <!-- book子结点对应的类 -->

<set-properties-rule >

<alias attr-name="id" prop-name="id" /> <!-- 子结点Book的属性 -->

<alias attr-name="name" prop-name="name" /> <!-- 子结点Book的属性 -->

</set-properties-rule>

<set-next-rule methodname="addBook" /> <!-- Model中的方法addBook,得到Book集合 -->

</pattern>

<pattern value="root/models/model/magazine">

<object-create-rule classname="bean.Magazine" /> <!-- magazine子结点对应的类 -->

<set-properties-rule >

<alias attr-name="id" prop-name="id" /> <!-- 子结点Magazine的属性 -->

<alias attr-name="name" prop-name="name" /> <!-- 子结点Magazine的属性 -->

<alias attr-name="time" prop-name="time" /> <!-- 子结点Magazine的属性 -->

</set-properties-rule>

<set-next-rule methodname="addMagazine"/> <!-- Model中的方法addMagazine,得到Magazine集合 -->

</pattern>

</digester-rules>

input.xml

<?xml version="1.0" encoding="UTF-8"?>

<root>

<models>

<model id="0001" name="测试一">

<book id="20091113" name="中国书"/>

<book id="20091113" name="中国书"/>

<magazine id="2009113" name="中国杂志" time="2009"/>

<magazine id="2009113" name="中国杂志" time="2009"/>

</model>

<model id="0002" name="测试二">

<book id="20091113" name="中国书"/>

<book id="20091113" name="中国书"/>

<magazine id="2009113" name="中国杂志" time="2009"/>

<magazine id="2009113" name="中国杂志" time="2009"/>

</model>

</models>

</root>

Test.java

import java.io.File;

import org.apache.commons.digester.Digester;

import org.apache.commons.digester.xmlrules.DigesterLoader;

import bean.Root;

public class Test

{

public static void main(String[] args)

{

try {

// 待解析文件路径

String inputFile="src/xml/input.xml";

// 模板文件路径

String rulesFile="src/xml/config.xml";

// 得到待解析文件File对象

File input = new File(inputFile);

// 得到模板文件File对象

File rules = new File(rulesFile);

// 装载模板

Digester digester = DigesterLoader.createDigester(rules.toURI().toURL());

// 得到Root对象

Root root = (Root) digester.parse(input);

//System.out.println(root.toString());

//System.out.println(root.getModels().get(0).getModels().get(0).getBooks().get(0).getName());

//System.out.println(root.getModels().get(0).getModels().get(0).getMagazines().get(0).getName());

} catch (Exception exc) {

exc.printStackTrace();

}

}

}

原创粉丝点击