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文档,结构如下:
2.创建装载xml数据的javabean
从文档结构可以映射出两个javabean,一个actioncategory,一个result。
Category.java
public class CategoryConfigElement
{
private String name;
private String actionBean;
private String templateBean;
private Map views=new HashMap();
@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 getViews() {
return views;
}
public void setViews(Map views) {
this.views = views;
}
public Map getVos() {
return vos;
}
public void setVos(Map 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"?>
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 actionCategoryMap=new HashMap();
/**
* 读取配置文件到内存
* @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加载配置的时候会匹配验证,抛出异常的。由于时间就先到这了,如果有什么疑问的可以给我留言,如果可以我可以帮助大家互相学习的。