Digester由"事件"驱动,通过调用预定义的规则操作对象栈,将XML文件转换为Java对象。
对使用者而言,Digester的核心在于匹配模式与规则(matching pattern + rule)。
其实就两点:
1、用一个XML文件定义Java对象的状态(数据源文件),
2、另一个XML文件定义装载数据源文件的装载逻辑
场景:
CRM要调用帐管的接口查帐单,由于帐管接口未定下来,或者经常变动。
所以先定义好帐单类,因为展示形式相对固定,所以可以先定义好类。
然后
String result = external2Oss.ossRequest(param);//帐管返回的帐单字符串 if (param.getRequestNo()==5) { result="<?xml version='1.0' encoding='GBK'?><oss-response> <BillInfo billCycle='20070701_20070801' totalCharge='130.0' unpaymentCharge='130.0' thisCharge='130.0' prepayCharge='0.0' adustmentCharge='0.0' freeCharge='0.0'></BillInfo></oss-response>"; } String clsName = t.getName().replaceAll("\\.", "/") + ".xml"; URL rulesURL = t.getClassLoader().getResource(clsName); Digester d = DigesterLoader.createDigester(rulesURL); d.push(obj); InputStream is = new ByteArrayInputStream(result.getBytes("GBK")); d.parse(is);
这样,以后改了接口的时候只要修改XML即可。
应用场景:
1.appframe解析defaults.xml
at org.apache.commons.digester.Digester.parse(Digester.java:1666) at com.ai.appframe2.complex.xml.XMLHelper.createDefaults(XMLHelper.java:304) at com.ai.appframe2.complex.xml.XMLHelper.getInstance(XMLHelper.java:79) at com.ai.appframe2.service.ServiceFactory.<clinit>(ServiceFactory.java:27)
2.tomcat解析server.xml
catalina.java
protected Digester createStartDigester() { long t1=System.currentTimeMillis(); // Initialize the digester Digester digester = new Digester(); digester.setValidating(false); digester.setRulesValidation(true); HashMap<Class, List<String>> fakeAttributes = new HashMap<Class, List<String>>(); ArrayList<String> attrs = new ArrayList<String>(); attrs.add("className"); fakeAttributes.put(Object.class, attrs); digester.setFakeAttributes(fakeAttributes); digester.setClassLoader(StandardServer.class.getClassLoader()); // Configure the actions we will be using digester.addObjectCreate("Server", "org.apache.catalina.core.StandardServer", "className"); digester.addSetProperties("Server"); digester.addSetNext("Server", "setServer", "org.apache.catalina.Server"); digester.addObjectCreate("Server/GlobalNamingResources", "org.apache.catalina.deploy.NamingResources");....