在许多需要处理XML格式数据的应用环境中, 如果能够以“事件驱动”的方式来处理XML文档,比如,当识别出特定的XML元素时,触发“创建对象”操作事件(或者触发调用对象的方法事件),这对于应用程序开发来说,是非常有用的;
  熟悉以SAX(Simple API for XML Parsing)方式来处理XML文档的开发人员会认识到,Digester为SAX事件提供了更高层次,对开发者更加友好的接口,它隐藏了大部分导航XML元素层次结构的细节,以便于开发者更加专注于要执行的处理操作;

使用Digester的基本步骤

  1. 创建一个 org.apache.commons.digester3.Digester 类的实例对象。这里补充说明下,只要我们已经完成XML解析操作,并且不在多个线程中使用同一个Digester对象,那么就可以安全的重复使用我们预先创建的这个Digester实例;不过重用Digester实例并不是非常推荐,最好每个XML解析对应一个单独的Digester实例;
  2. 为Digester实例配置属性值,通过配置属性值,我们可以改变Digester 的解析行为,具体有哪些属性值可以配置,待会会介绍;
  3. 可选的, 可以将我们的一些初始对象push到Digester栈里;.
  4. 在输入的XML文档中,给所有需要触发规则(rule)处理的元素匹配模式(pattern)注册规则;针对任何一个模式,你可以注册任意数量的规则;补充说明下,如果一个模式对应多个规则,则begin和body事件方法会按照它们注册的顺序依次执行,而end事件方法是倒序执行的;
  5. 最后,调用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;
    }

}
View Code

相关文章:

  • 2022-12-23
  • 2021-11-12
  • 2021-11-16
  • 2021-09-23
  • 2021-12-07
  • 2022-12-23
  • 2021-10-01
  • 2021-05-30
猜你喜欢
  • 2021-11-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-03
  • 2021-06-30
相关资源
相似解决方案