解析XML工具之Digester详细说明
来源:互联网 发布:海洋量子号js套房礼遇 编辑:程序博客网 时间:2024/05/17 02:49
XML作为web应用的重要部分,所以很多程序有使用xml作为服务配置。现在解析XML的组件有很多,比如DOM,xquery,xpath等。
本文介绍一种XML的方法,digester工具类。
Digester简介:
Digester框架属于Jakarta Commons,它以规则和模式为基础处理XML文档。与SAX和DOM之类的标准API相比,Digester不涉及太多的细节问题,非常适合于对XML文档进行简单的处理。
在Java和XML开发中,一个常见的任务是把XML文档转换成对应的Java Bean对象的层次结构。人们经常用标准的SAX和DOM API来完成这个任务。虽然这两种API都很强大和灵活,但对于某些简单的任务来说,它们显得操作层次太低,也就是说,涉及了太多的细节问题。Jakarta Digester框架能够很好地满足这类场合的需要。
Digester框架简介
Jakarta的Digester框架从Struts框架发展而来,原先被用来处理struts-config.xml配置文件,但很快人们认识到它有着更广泛的用途,把它转入了Jakarta Commons项目。Jakarta Commons的目标是提供一个“可重用Java组件的仓库”。Digester最新的版本是1.3,于2002年8月13日发布。
Digester框架允许开发者指定一组动作,当解析器在XML文档中发现某些特定的简单模式时动作被执行。Digester框架带有10个预定义的规则(Rule),涵盖了unmarshalling XML(例如创建Bean或设置Bean属性)的大多数需求( marshalling的原意是指“配制整齐,编组列车”,marshalling是在内存中为Java对象生成XML描述文档的过程,而unmarshalling是指把XML形式的描述转换到可用Java代码操作的对象的过程,我们称之为“反配制”),但必要时用户可以定义和实现自己的规则。
上述都是网上的描述,简单点说就是struts框架中的一个解析配置的工具类。网上现在digester的实例还是蛮多了,但是详细介绍的就比较少了,感觉项目上使用这个还蛮方便的就给大家介绍下。
Digester实例:
1.需要解析的xml文档,结构如下:
<?xml version="1.0" encoding="UTF-8"?><actionCategory name="ReqType" actionBean="cn.com.btmu.art.framework.controller.dispatch.impl.SummaryDispatchAction" templateBean="cn.com.btmu.art.framework.service.template.SummaryService"> <!--对应前台的action参数--> <result name="toSummaryPage" page="222222222"/></actionCategory>
2.创建装载xml数据的javabean
从文档结构可以映射出两个javabean,一个actioncategory,一个result。
Category.java
public class CategoryConfigElement {private String name;private String actionBean;private String templateBean;private Map<String,ResultConfigElement> views=new HashMap<String,ResultConfigElement>();@SuppressWarnings("unchecked")public void addView(ResultConfigElement view) throws SAXException{String viewName=view.getName();if(views.size()>0){if(views.containsKey(viewName)){throw new SAXException("配置文件中名称为 "+this.name+" actionCategory node下result node 存在重复的name: "+viewName+".");}else{views.put(viewName,view);}}else{views.put(viewName,view);}}public String getTemplateBean() {return templateBean;}public void setTemplateBean(String templateBean) {this.templateBean = templateBean;}public Map<String, ResultConfigElement> getViews() {return views;}public void setViews(Map<String, ResultConfigElement> views) {this.views = views;}public Map<String, VoConfigElement> getVos() {return vos;}public void setVos(Map<String, VoConfigElement> vos) {this.vos = vos;}}
Result.java
public class ResultConfigElement { private String name; private String page; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } }
Result.java
3.指定模式和规则digester的模式,就是指让组件按照什么模式解析XML到javabean。模式规则详细了解,请参考Digester API,本文重点侧重是应用。http://commons.apache.org/digester/解析规则Digester提供了两种方式,一种是java类,一种是配置xml规则关系模板。
(1).java类的形式,如:XmlTemplate.java
public class XmlTemplate {public static Digester setMatch(){Digester digester=new Digester(); //解析actionCategory节点元素内容到ActionCategory digester.addObjectCreate("actionCategory", CategoryConfigElement.class); digester.addSetProperties("actionCategory"); //解析actionCategory/view节点元素内容到View digester.addObjectCreate("actionCategory/result", ResultConfigElement.class); digester.addSetProperties("actionCategory/result"); digester.addSetNext("actionCategory/result", "addView");}}
(2).xml模板的形式,如:template.xml
?xml version="1.0" encoding="UTF-8"?> <digester-rules> <pattern value="actionCategory"> <!-- actionCategory作为根结点 --><object-create-rule classname="cn.com.btmu.art.framework.config.element.CategoryConfigElement" /> <!-- 根结点对应的类 --><set-properties-rule ><alias attr-name="class" prop-name="cls" /></set-properties-rule></pattern> <!-- view start --><pattern value="actionCategory/result"> <object-create-rule classname="cn.com.btmu.art.framework.config.element.ResultConfigElement" /> <set-properties-rule /><set-next-rule methodname="addView"/> </pattern>
<!-- view end --> <set-next-rule methodname="addView"/>,addView 对应javabean:category。java的addView方法。
4.加载匹配规则
Digester解析XML主要是通过用户指定的规则模板,来解析xml文件的。
加载匹配规则的方式有两种:
(1).加载模板类的规则,即上述的XmlTemplate.java的rule设置。
创建digester对象
public static void initTemplateForActionCategory() throws SAXException{digester=XmlTemplate.setMatch();}
(2).加载xml规则模板,即上述的template.xml.的rule设置。
用XML模板的形式,需要继承FromXmlRulesModule规则类,加载rule模板。
1.加载rule模板
public class ConfigRulesModule extends FromXmlRulesModule{@Overrideprotected void loadRules() {File file = new File("src/cn/com/btmu/art/framework/config/template/category_template.xml");loadXMLRules(file);}}
2.创建digester对象
public static void initTemplateForActionCategory() throws SAXException{DigesterLoader loader=DigesterLoader.newLoader(new ConfigRulesModule());digester= loader.newDigester();}
5.大功告成,马上就可以获取XML上的各种数据信息了,我们将digester对象解析的数据放入Map对象里,放入内存,或者缓存,这是我们一般的用例场景。
public abstract class BaseConfigLoader {public static Map<String,CategoryConfigElement> actionCategoryMap=new HashMap<String, CategoryConfigElement>();/** * 读取配置文件到内存 * @param cfg * @throws IOException * @throws SAXException */public static void builderForConfig(File cfg) throws IOException, SAXException{File[] files = cfg.listFiles();for (File file : files) {if(file.isFile()){String fileName = file.getName();int lastIndex = fileName.lastIndexOf(".");String suffix = fileName.substring(lastIndex,fileName.length());if(CONFIG_SUFFIX.equals(suffix)){CategoryConfigElement root = digester.parse(file);actionCategoryMap.put(root.getName(), root);}}}}}
以上就完成了Digester运用的全部步骤,发觉网上的文档,到第四步和第五步,介绍加载digester对象和XML模板配置形式的时候的实例很少,所以写一个小例子,希望对大家有帮助
。有时候我们项目中,还要设计到XSD的验证,比如要一个元素在XML中不能为空,或者限制出现的次数必须为一次时,Digester也提供了有方法,写好XSD,digester加载配置的时候会匹配验证,抛出异常的。由于时间就先到这了,如果有什么疑问的可以给我留言,如果可以我可以帮助大家互相学习的。
- 解析XML工具之Digester详细说明
- Digester(xml解析工具)
- xml解析工具Digester
- xml 解析之digester
- Java 解析 xml 之 Digester
- XML解析之Digester(新手必看)
- Java XML解析之Digester的使用
- Java XML解析之Digester的使用
- XML解析利器:Digester
- 用Digester解析XML
- 解析xml----Digester
- Digester解析xml文件
- Digester解析xml文档
- 使用Digester解析xml
- Digester解析XML
- Digester 解析XML文件
- xml 解析 digester
- Digester解析xml详解
- Shell 基本语法
- R-数据保存和输出
- Handler消息机制浅谈
- WLAN和移动网互通技术分析
- params 传参 params string[] param
- 解析XML工具之Digester详细说明
- Android开发点点滴滴——事件处理
- 使用TabHost实现QQ标签栏
- 开启cloudstack的8096端口
- STL 容器类型
- 2014找工作总结-机会往往留给有准备的人
- hdu 1548
- matlab生成一个三角形平面的法向量
- MFC中,为自己派生的CStatic控件添加ToolTip