依赖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();
}
}
}