将以下 XML 文件构造成 ArrayList;
<?xml version="1.0" encoding="ISO8859_1"?>
<beans>
<bean id="1111" name="abc"/>
<bean id="2222" name="bcd"/>
</beans>
MyBean 类
public class MyBean {
private String name=null;
private String id=null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
///测试类
public class DigesterTest {
ArrayList<MyBean> mylist=new ArrayList<MyBean>();
public DigesterTest(){
Digester digester=new Digester();
digester.push(mylist);
digester.addObjectCreate("beans/bean", MyBean.class);
digester.addSetProperties("beans/bean");
digester.addSetNext("beans/bean","add");
try {
digester.parse(new File(System.getProperty("user.dir"),"//src//bean.xml"));
for(MyBean bean:mylist){
System.out.println(bean.getId()+" "+bean.getName());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void RuleParse(){
Digester digester=new Digester();
digester.addRule("beans", new ListRule());
digester.addRule("beans/bean",new BeanRule());
try {
List<MyBean> list=(List<MyBean>)digester.parse(new File(System.getProperty("user.dir"),"//src//bean.xml"));
for(MyBean bean:list){
System.out.println(bean.getId()+" "+bean.getName());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void add(MyBean bean){
this.mylist.add(bean);
}
public static void main(String[] args){
DigesterTest t=new DigesterTest();
t.RuleParse();
}
}
2.2 Digester 的处理过程 (Rule, XPath, Object Stack)
首先为 Digester 指明处理规则, 每种处理规则都要匹配 XPath,如下:
digester.addObjectCreate("beans", ArrayList.class):
digester.addObjectCreate("beans/bean",MyBean.class);
digester.addSetProperties("list/bean");
digester.addSetNext("list/bean", "add");
注意:上述程序并不是处理 XML 文档,而且指明如何处理 XML 文档
然后,Digester 开始解析 XML 文档
digester.parse(xxx);
Digester 遍历整个 DOM 树, 当遇到一个元素时,便找到与该元素路径匹配的 Rule,并调用这个 Rule 来处理该元素。
Rule 使用 Digester 的 Object Stack 来使用或存放中间处理过程产生的对象。当整棵数遍历完毕时,Object Stack
栈底的对象即为最后结果对象。
2.3 使用 Digester 内建的规则
ObjectCreate
SetNext
SetProperties
SetProperty
CallMethod
FactoryCreate
2.4 使用自定义的规则
对于第一个例子,不使用内建的规则,而使用自定的规则处理,用于演示自定义规则的用法
public class ListRule extends Rule {
@Override
public void begin(String namespace, String name, Attributes attributes)
throws Exception {
// TODO Auto-generated method stub
digester.push(new ArrayList());
}
}
public class BeanRule extends Rule {
@Override
public void begin(String namespace, String name, Attributes attributes)
throws Exception {
// TODO Auto-generated method stub
List list=(List)digester.peek();
MyBean bean=new MyBean();
bean.setId(attributes.getValue("id"));
bean.setName(attributes.getValue("name"));
list.add(bean);
}
}
<?xml version="1.0" encoding="ISO8859_1"?>
<beans>
<bean id="1111" name="abc"/>
<bean id="2222" name="bcd"/>
</beans>
MyBean 类
public class MyBean {
private String name=null;
private String id=null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
///测试类
public class DigesterTest {
ArrayList<MyBean> mylist=new ArrayList<MyBean>();
public DigesterTest(){
Digester digester=new Digester();
digester.push(mylist);
digester.addObjectCreate("beans/bean", MyBean.class);
digester.addSetProperties("beans/bean");
digester.addSetNext("beans/bean","add");
try {
digester.parse(new File(System.getProperty("user.dir"),"//src//bean.xml"));
for(MyBean bean:mylist){
System.out.println(bean.getId()+" "+bean.getName());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void RuleParse(){
Digester digester=new Digester();
digester.addRule("beans", new ListRule());
digester.addRule("beans/bean",new BeanRule());
try {
List<MyBean> list=(List<MyBean>)digester.parse(new File(System.getProperty("user.dir"),"//src//bean.xml"));
for(MyBean bean:list){
System.out.println(bean.getId()+" "+bean.getName());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void add(MyBean bean){
this.mylist.add(bean);
}
public static void main(String[] args){
DigesterTest t=new DigesterTest();
t.RuleParse();
}
}
2.2 Digester 的处理过程 (Rule, XPath, Object Stack)
首先为 Digester 指明处理规则, 每种处理规则都要匹配 XPath,如下:
digester.addObjectCreate("beans", ArrayList.class):
digester.addObjectCreate("beans/bean",MyBean.class);
digester.addSetProperties("list/bean");
digester.addSetNext("list/bean", "add");
注意:上述程序并不是处理 XML 文档,而且指明如何处理 XML 文档
然后,Digester 开始解析 XML 文档
digester.parse(xxx);
Digester 遍历整个 DOM 树, 当遇到一个元素时,便找到与该元素路径匹配的 Rule,并调用这个 Rule 来处理该元素。
Rule 使用 Digester 的 Object Stack 来使用或存放中间处理过程产生的对象。当整棵数遍历完毕时,Object Stack
栈底的对象即为最后结果对象。
2.3 使用 Digester 内建的规则
ObjectCreate
SetNext
SetProperties
SetProperty
CallMethod
FactoryCreate
2.4 使用自定义的规则
对于第一个例子,不使用内建的规则,而使用自定的规则处理,用于演示自定义规则的用法
public class ListRule extends Rule {
@Override
public void begin(String namespace, String name, Attributes attributes)
throws Exception {
// TODO Auto-generated method stub
digester.push(new ArrayList());
}
}
public class BeanRule extends Rule {
@Override
public void begin(String namespace, String name, Attributes attributes)
throws Exception {
// TODO Auto-generated method stub
List list=(List)digester.peek();
MyBean bean=new MyBean();
bean.setId(attributes.getValue("id"));
bean.setName(attributes.getValue("name"));
list.add(bean);
}
}