解析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加载配置的时候会匹配验证,抛出异常的。由于时间就先到这了,如果有什么疑问的可以给我留言,如果可以我可以帮助大家互相学习的。

 

原创粉丝点击