美文网首页
commons-digester3使用和介绍

commons-digester3使用和介绍

作者: 左洁 | 来源:发表于2019-11-05 14:19 被阅读0次

1.环境

jdk11

pom文件引入包版本

<!--digester3 解析xml包引入-->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-digester3</artifactId>
  <version>3.2</version>
</dependency>

1.1介绍

在查阅tomcat源码中才了解到digester,digester是把xml文件解析成pojo对象,digester底层使用sax(Simple API for XML Parsing)方式来读取xml,本文暂不介绍sax

2.工程案例

代码片段,源码链接

public class DigesterMain {

    public static void main(String[] args) {
        
        URL url =
                new Digester().getClassLoader().getResource("digester/example.xml");
        String filename = url.getFile();
        Digester d = new Digester();
        AddressBook book = new AddressBook();
        //把book放在栈顶
        d.push(book)
        //增加解析xml规则
        addRules(d);

        try {
            java.io.File srcfile = new java.io.File(filename);
            //解析文件
            d.parse(srcfile);
        } catch (java.io.IOException ioe) {
            System.out.println("Error reading input file:" + ioe.getMessage());
            System.exit(-1);
        } catch (org.xml.sax.SAXException se) {
            System.out.println("Error parsing input file:" + se.getMessage());
            System.exit(-1);
        }


        book.print();
    }

    private static void addRules(Digester d) {


        //增加创建对象规则 并添加
        d.addObjectCreate("address-book/person", Person.class);
        //设置属性规则
        d.addSetProperties("address-book/person");
       //当遇到结束标签时候经过层层递归到元素时候 调用该方法把值设置到上级 方法在接下标签开始时候不操作                   //元素 在遇到结束标签才触发操作
        d.addSetNext("address-book/person", "addPerson");

        //设置该路径下 调用方法
        d.addCallMethod("address-book/person/name", "setName", 0);

        //设置该路径下 调用方法
        d.addCallMethod("address-book/person/email", "addEmail", 2);
        //设置该路径下 方法中参数
        d.addCallParam("address-book/person/email", 0, "type");
        //设置该路径下 方法中参数
        d.addCallParam("address-book/person/email", 1);

        //创建该路径下对象
        d.addObjectCreate("address-book/person/address", Address.class);

        d.addSetNext("address-book/person/address", "addAddress");
        d.addSetNestedProperties("address-book/person/address");
    }
}

Example.xml文件

<address-book>
  <person id="1" category="acquaintance">
    <name>Gonzo</name>
    <email type="business">gonzo@muppets.com</email>
    <address>
      <type>home</type>
      <street>123 Maine Ave.</street>
      <city>Las Vegas</city>
      <state>NV</state>
      <zip>01234</zip>
      <country>USA</country>
    </address>
  </person>
</address-book>

addressBook

public class AddressBook
{

    private final LinkedList<Person> people = new LinkedList<Person>();

    public void addPerson( Person p )
    {
        people.addLast( p );
    }

    public void print()
    {
        System.out.println( "Address book has " + people.size() + " entries" );

        for (Person p : people) {
            p.print();
        }
    }

}

3.核心类流程图

3.1 使用digester类介绍

3.1.1属性stack 保存xml中元素,不断把解析元素压入栈中,遇到解析结束标签出栈

3.1.2属性rules保存处理元素规则

3.2流程图

digester01.png

相关文章

  • commons-digester3使用和介绍

    1.环境 jdk11 pom文件引入包版本 1.1介绍 在查阅tomcat源码中才了解到digester,dige...

  • Runtime介绍和使用

    说到Runtime, 一直是很多(极少)人的软肋,含含糊糊的认知,被别人问到的时候,此题超纲... 将来跳槽粗去面...

  • OpenSSL 介绍和使用

    一、SSL 简介 按照我的理解来解释下,为了让网络通信更安全,需要认证和加密,认证是说明你是要找的人,加密是为了让...

  • HandlerThread 介绍和使用

    为了避免 ANR,我们常常需要在线程中做耗时操作,然后把结果抛到主线程进行处理。 参考:https://blog....

  • Lombok介绍和使用

    引入使用 官网有简单的安装和使用教程。 IEDA安装介绍 Lombok介绍和优点 https://projectl...

  • ajax介绍和使用

    AJAX ajax 是什么?(异步JavaScript和XML)Asynchronous JavaScript +...

  • Homebrew介绍和使用

    一、Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、...

  • libvirt介绍和使用

    导读: why&&what libvirt具体介绍 API 剖析 driver 剖析 如何使用libvirt? w...

  • git 介绍和使用

    git 是什么? git 是目前世界上最先进的分布式版本控制系统。 git与SVN的主要区别 Git是分布式版本控...

  • OkHttp 介绍和使用

    OkHttp 网络通信层的库 ,Android 4.4后,HttpURLConnection底层实现已被OkHtt...

网友评论

      本文标题:commons-digester3使用和介绍

      本文链接:https://www.haomeiwen.com/subject/ougsbctx.html