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");....