在许多需要处理XML格式数据的应用环境中, 如果能够以“事件驱动”的方式来处理XML文档,比如,当识别出特定的XML元素时,触发“创建对象”操作事件(或者触发调用对象的方法事件),这对于应用程序开发来说,是非常有用的;
熟悉以SAX(Simple API for XML Parsing)方式来处理XML文档的开发人员会认识到,Digester为SAX事件提供了更高层次,对开发者更加友好的接口,它隐藏了大部分导航XML元素层次结构的细节,以便于开发者更加专注于要执行的处理操作;
使用Digester的基本步骤
- 创建一个 org.apache.commons.digester3.Digester 类的实例对象。这里补充说明下,只要我们已经完成XML解析操作,并且不在多个线程中使用同一个Digester对象,那么就可以安全的重复使用我们预先创建的这个Digester实例;不过重用Digester实例并不是非常推荐,最好每个XML解析对应一个单独的Digester实例;
- 为Digester实例配置属性值,通过配置属性值,我们可以改变Digester 的解析行为,具体有哪些属性值可以配置,待会会介绍;
- 可选的, 可以将我们的一些初始对象push到Digester栈里;.
- 在输入的XML文档中,给所有需要触发规则(rule)处理的元素匹配模式(pattern)注册规则;针对任何一个模式,你可以注册任意数量的规则;补充说明下,如果一个模式对应多个规则,则begin和body事件方法会按照它们注册的顺序依次执行,而end事件方法是倒序执行的;
- 最后,调用digester.parse()方法,该方法需要传入XML文件的引用作为参数,该参数支持多种格式的文件流;另外需要注意的是,该方法会抛出IOException or SAXException异常,以及各种可能的在规则解析处理时遇到的异常,如NoSuchMethodException、IllegalAccessException…
了解基本步骤后,来看一个简单的示例,如下所示,是我们即将要解析的xml文件:
<foo name="The Parent"> <bar id="123" title="The First Child" /> <bar id="456" title="The Second Child" /> <bar id="789" title="The Second Child" /> </foo>
首先,创建两个java bean对应xml中的元素信息:
Foo类
package apache.commons.digester3.example.pojo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @author http://www.cnblogs.com/chenpi/ * @version 2017年6月3日 */ public class Foo { private String name; private List<Bar> barList = new ArrayList<Bar>(); public void addBar(Bar bar) { barList.add(bar); } public Bar findBar(int id) { for (Bar bar : barList) { if (bar.getId() == id) { return bar; } } return null; } public Iterator<Bar> getBars() { return barList.iterator(); } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the barList */ public List<Bar> getBarList() { return barList; } /** * @param barList the barList to set */ public void setBarList(List<Bar> barList) { this.barList = barList; } }