为了满足将XML转换为JavaBean的特殊需求,Apache旗下的一个名为Digester的工具为我们提供了这么一个选择。
将XML转化为JavaBean存储在内存当中, 解析的关键在于用以匹配XML的模式以及规则等
以解析下面XML为例介绍Digester
<@H_301_8@root>
<@H_301_8@person>
<@H_301_8@username>张三</@H_301_8@username>
<@H_301_8@age>22</@H_301_8@age>
<@H_301_8@idcard>320105197903082216</@H_301_8@idcard>
<@H_301_8@address>北京海淀</@H_301_8@address>
<@H_301_8@note></@H_301_8@note>
</@H_301_8@person>
<@H_301_8@person>
<@H_301_8@username>李四</@H_301_8@username>
<@H_301_8@age>20</@H_301_8@age>
<@H_301_8@idcard>610114197601064931</@H_301_8@idcard>
<@H_301_8@address>上海徐汇</@H_301_8@address>
<@H_301_8@note></@H_301_8@note>
</@H_301_8@person>
<@H_301_8@person>
<@H_301_8@username>王五</@H_301_8@username>
<@H_301_8@age>26</@H_301_8@age>
<@H_301_8@idcard>130105198710113660</@H_301_8@idcard>
<@H_301_8@address>广州天河</@H_301_8@address>
<@H_301_8@note></@H_301_8@note>
</@H_301_8@person>
</@H_301_8@root>
此XML文件分两层结构,分别为:
<root>
节点,下面包含多个<person>
节点<person>
节点,下面包含各信息节点,如<username>、<age>
等
我们的目的是把<person>
节点里面的信息提取出来,所以可以把person看做一个对象
里面的信息节点就是对象的属性
Person类如下:
public class @H_301_8@Person {
private String username;
private String age;
private String idcard;
private String address;
private String note;
public String @H_301_8@getUsername() {
return username;
}
public void @H_301_8@setUsername(String username) {
this.username = username;
}
public String @H_301_8@getAge() {
return age;
}
public void @H_301_8@setAge(String age) {
this.age = age;
}
public String @H_301_8@getIdcard() {
return idcard;
}
public void @H_301_8@setIdcard(String idcard) {
this.idcard = idcard;
}
public String @H_301_8@getAddress() {
return address;
}
public void @H_301_8@setAddress(String address) {
this.address = address;
}
public String @H_301_8@getNote() {
return note;
}
public void @H_301_8@setNote(String note) {
this.note = note;
}
public String @H_301_8@toString() {
StringBuffer buf = new StringBuffer();
buf.append("username: " + username);
buf.append(",age: " + age);
buf.append(",idcard: " + idcard);
buf.append(",address: " + address);
buf.append(",note: " + note);
return buf.toString();
}
}
创建Root类,用来保存Person对象
public class @H_301_8@Root {
private List persons;
public @H_301_8@Root() {
persons = new ArrayList();
}
/** * 把Root下面的Person添加到一个集合中 * * @param per */
public void @H_301_8@addPerson(Person per) {
persons.add(per);
}
/** * 获取Person对象集合 * * @return */
public List @H_301_8@getPersons() {
return persons;
}
}
创建DigesterDriver类,对XML进行解析
import com.home.bean.Person;
import com.home.bean.Root;
import org.apache.commons.digester3.Digester;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class @H_301_8@DigesterDriver {
public static void @H_301_8@main(String[] args) {
// 定义要解析的 XML 的路径,并初始化工具类
File input = new File("person.xml");
Digester digester = new Digester();
digester.setValidating(false);
// 添加Root对象,对应 XML中的<root>节点
digester.addObjectCreate("root",Root.class);
// 添加Person对象,对应 XML中的<person>节点
digester.addObjectCreate("root/person",Person.class);
//添加Person对象下的各个属性,对象<person>节点下的各个信息节点
digester.addBeanPropertySetter("root/person/username","username");
digester.addBeanPropertySetter("root/person/age","age");
digester.addBeanPropertySetter("root/person/idcard","idcard");
digester.addBeanPropertySetter("root/person/address","address");
digester.addBeanPropertySetter("root/person/note","note");
// 通过调用 JavaBean 的 addPerson() 方法来把多个 person 加到一个集合中
digester.addSetNext("root/person","addPerson");
try {
// 进行解析
Root root = (Root) digester.parse(input);
List persons = root.getPersons();
for (int i = 0; i < persons.size(); i++) {
Person p = (Person) persons.get(i);
System.out.println(p);
}
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
上述代码展示了Digester处理XML 的一些基本要点,主要是说明了一些模式以及规则的匹配。
简言之,Digester就是一种用来把一个XML转化为一个与该XML结构类似的 JavaBean。
你可以把XML根元素想象成一个JavaBean, 该根元素的attribute就是这个JavaBean的各种 Field,
当该根元素有其他子tag时,又要把这个子tag想象成一个个新的XML,将其视为一个新的JavaBean,
并作为一个Field加入到父Bean当中,然后以此类推,通过循环的方式将整个XML进行解析。
所需JAR包:
commons-digester3-3.2.jar
commons-logging-1.0.4.jar
commons-beanutils-1.7.0.jar
作者:itmyhome