利用Digester实现xml和bean之间的转换(二)
来源:互联网 发布:网络推广月度工作计划 编辑:程序博客网 时间:2024/05/24 04:51
Digester框架属于Jakarta Commons,它以规则和模式为基础处理XML文档。与SAX和DOM之类的标准API相比,Digester不涉及太多的细节问题,非常适合于对XML文档进行简单的处理。比如要解析如下的xml文件
<persons> <person name="tom"> <age>4</age> <address> <street>no1street</street> <belongarea>us</belongarea> </address> <creditcard> <limit code="123" pwd="abc">1000</limit> <bank>ICBC</bank> </creditcard> <creditcard> <limit code="321" pwd="cba">2000</limit> <bank>CBC</bank> </creditcard> </person> <person name="jerry"> <age>5</age> <address> <street>no2street</street> <belongarea>us</belongarea> </address> </person> </persons>
首先定义address对应的类
public class Address { private String street; private String belongArea; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getBelongArea() { return belongArea; } public void setBelongArea(String belongArea) { this.belongArea = belongArea; } @Override public String toString(){ return "street:" +this.getStreet() + ", belongarea:" + this.getBelongArea(); }}
接着定义creditcard对应的类
public class Creditcard { private int code; private String pwd; private String limit; private String bank; public void setParam(String limit, String bank){ this.limit = limit; this.bank = bank; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getLimit() { return limit; } public void setLimit(String limit) { this.limit = limit; } public String getBank() { return bank; } public void setBank(String bank) { this.bank = bank; } @Override public String toString(){ return "limit code:" + this.getCode() + ", pwd:" + this.getPwd() + ", limitValue:" + this.getLimit() + ", bank:" + this.getBank(); }}
接下来定义person对应的类
import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2016/7/1 0001. */public class Person { private String name; private int age; private Address address; private List<Creditcard> creditcard = new ArrayList<Creditcard>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public List<Creditcard> getCreditcard() { return creditcard; } public void setCreditcard(List<Creditcard> creditcard) { this.creditcard = creditcard; } public void addCreditcard(Creditcard creditcard){ this.creditcard.add(creditcard); } @Override public String toString(){ return "name:" + this.getName() + ", age:" + this.getAge() + "\naddress:" + this.getAddress() + "\ncreditcare:" + this.getCreditcard(); }}
最后定义persons对应的类
public class Root { private List<Person> person = new ArrayList<Person>(); public List<Person> getPerson() { return person; } public void setPerson(List<Person> person) { this.person = person; } public void addPerson(Person person){ this.person.add(person); } @Override public String toString(){ for(Person person : this.getPerson()){ System.out.print( "person: " + person + "\n"); } return ""; }}
需要注意的是,所有的对象都必须是public类型重点内容
然后来写解析文件
import org.apache.commons.digester.Digester;import org.xml.sax.SAXException;import java.io.File;import java.io.IOException;public class Main { public static void main(String[] args) { //digester Digester digester = new Digester(); digester.setValidating(false); digester.addObjectCreate("persons",Root.class); digester.addObjectCreate("persons/person", Person.class); //name digester.addSetProperties("persons/person", "name", "name"); //age digester.addBeanPropertySetter("persons/person/age"); //address digester.addObjectCreate("persons/person/address",Address.class); digester.addBeanPropertySetter("persons/person/address/street"); digester.addBeanPropertySetter("persons/person/address/belongarea","belongArea"); digester.addSetNext("persons/person/address","setAddress"); //creditcard digester.addObjectCreate("persons/person/creditcard",Creditcard.class); digester.addCallMethod("persons/person/creditcard","setParam",2); digester.addCallParam("persons/person/creditcard/limit",0); digester.addCallParam("persons/person/creditcard/bank",1); /*实现跟上面3条语句同样的功能 digester.addBeanPropertySetter("persons/person/creditcard/limit","limit"); digester.addBeanPropertySetter("persons/person/creditcard/bank","bank");*/ digester.addSetProperties("persons/person/creditcard/limit","code","code"); digester.addSetProperties("persons/person/creditcard/limit","pwd","pwd"); digester.addSetNext("persons/person/creditcard","addCreditcard"); digester.addSetNext("persons/person","addPerson"); Root root; try { root = (Root)digester.parse(new File("C:\\file3.xml")); System.out.println(root); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } }}
1、首先生成Digester对象,并且设置不进行dtd校验
2、addObjectCreate方法是解析标签,第一个参数是对应于xml的标签,第二个参数是Java Bean的Class
这个方法会将一个Class放进栈中
3、addSetProperties方法是解析属性,第一个参数是对应xml的标签,第二个参数是属性名,第三个参数是Bean中的变量名。
4、addBeanProperties方法是解析元素,第一个参数是对应元素,第二个参数是Bean中的变量名,当他们相同时,可以省略。
5、addSetNext方法是解析列表,当一个Class解析完,必须调用,参数一是对应标签,参数二有两种情况,如果有相同的列表,则是add方法,如果没有,就是set方法,相当于出栈。
6、addCallMethod方法,是直接显式调用bean中的方法,参数一是对应标签,参数二是bean中方法名,参数三是方法参数个数。当参数三为0时表示,这个方法有一个参数,取值来自这个标签。当参数三不为0时,要通过addCallParam方法指定参数取值。
addCallParam方法有两个参数,参数1是对应元素,参数二是指当前元素的值作为第几个参数传入addCallMethod方法中。
7、parse方法,传入解析的xml文件。
0 0
- 利用Digester实现xml和bean之间的转换(二)
- 利用Digester和JABX实现xml和bean之间的转换之对比(三)
- 利用JAXB实现xml和bean之间的转换(一)
- 利用JAXB实现xml和bean之间的转换(一)
- 用Digester实现xml转换成bean
- 利用Xstream注解实现xml和java bean之间的转换
- 利用digester来将xml转换为bean
- Xml和bean之间的相互转换
- 利用JAXB进行Bean与XML之间的转换
- JAXB实现JAVA BEAN与XML之间的转换
- JAXB 实现bean与xml之间的转换
- Jackson用于Bean和XML之间转换
- Spring MVC中利用注解实现XML和Java对象之间的转换
- java 利用内省实现bean和map的转换
- java bean和json之间的转换
- json数据和bean之间的转换
- 利用Digester把XML转换为Java对象
- 利用Digester把XML转换为Java对象
- mysql语句或者phpmyadmin操作取消外键约束
- 几个 Context 上下文的区别
- python中几种不同类型的参数的区分及其定义时的顺序
- 【RT-Thread学习笔记 2】RT-Thread的线程(任务)处理
- Redis安装+主从配置 过程中 的几个小 Tips
- 利用Digester实现xml和bean之间的转换(二)
- rsyslog研究
- LA 2995 Image Is Everything
- 给DotSpatial实现中距离/长度测量图层
- OData Edm.Geography和Edm.Geometry基本类型
- JQuery定时器
- 【RT-Thread学习笔记 3】线程优先级抢占实验
- 框架
- java中静态代码块的用法 static用法详解