解析XML工具之Digester详细说明


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{

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值