Java XML解析之Digester的使用

Digester據說最早是為解析struts的配置文件開發的,后來慢慢的就發展成一個輕量,快速,單向(只能從xml到java對象)的一個綁定框架,在運行時實現綁定,無需定義xml文件的DTD或Schema,簡單快速。

一、使用Digester的步驟

1. 創建一個Digester的實例。完成parse后,實例可以被安全的重用,但實例不是線程安全的。

2. 設置配置屬性

3. 加入處理規則

4. 調用digester.parse()方法。

二、從一個例子說起

先看一個Digester文檔上的簡單例子

對象樹

package mypackage;

public class Foo ...{

public void addBar(Bar bar);

public Bar findBar(int id);

public Iterator getBars();

public String getName();

public void setName(String name);

}

package mypackage;

public class Bar ...{

public int getId();

public void setId(int id);

public String getTitle();

public void setTitle(String title);

}

XML文檔片段

解析代碼

Digester digester = new Digester();

digester.setValidating(false);

digester.addObjectCreate("foo", "mypackage.Foo");

digester.addSetProperties("foo");

digester.addObjectCreate("foo/bar", "mypackage.Bar");

digester.addSetProperties("foo/bar");

digester.addSetNext("foo/bar", "addBar", "mypackage.Bar");

Foo foo = (Foo) digester.parse();

從例子可以看到Digester的執行步驟是掃描xml文檔,匹配特定的xml節點,在每一個節點按照預定的處理規則操縱對象,包括創建對象,設置對象屬性,建立對象樹等。

三、節點匹配規則

-- Matches pattern "a"           -- Matches pattern "a/b"          -- Matches pattern "a/b/c"          -- Matches pattern "a/b/c"               -- Matches pattern "a/b"          -- Matches pattern "a/b/c"          -- Matches pattern "a/b/c"          -- Matches pattern "a/b/c"        可以看到匹配規則非常簡單,此外,匹配還支持通配符,像*/a就匹配任意層次內的。

一個特定的XML元素可以被匹配多次,所對應的處理規則執行的順序如下:如果是begin和body方法,按照規則被加入到Digester的順序執行,如果是end方法,則相反(參見后面處理規則)。

對於通配符匹配,當一個確定的匹配發生時(如果多個通配符匹配發生,最長的一個被認為是一個確定的匹配),通配符匹配將被忽略。這個意思就是說,當規則A被加入到*/a時,意思是這個規則匹配任意一個元素,但是如果規則C被加入到x/a,則A對於

Rule ruleA = new ObjectCreateRule();  Rule ruleB = new SetNextRule();  Rule ruleC = new SetPropertiesRule();  digester.addRule("*/a", ruleA);  digester.addRule("*/a", ruleB);digester.addRule("x/a", ruleA);  digester.addRule("x/a", ruleB);  digester.addRule("x/a", ruleC);

四、處理規則

處理規則的目的就是定義當匹配發生時做什么事情。每一個處理規則都是org.apache.commons.digester.Rule接口的實現類。當匹配發生時Rule接口的回調方法被調用,執行相應的操作。

Rule接口的方法:

begin       當進入匹配元素時調用

body        當進入匹配元素的內容時調用

end         當離開匹配元素時調用

finish      當paser結束時調用

常見的內置處理規則

ObjectCreateRule:進入匹配元素時調用,創建一個特定的java對象。

SetPropertiesRule:進入匹配元素時調用,利用Java的反射API設置棧頂對象的屬性,要求Java對象的屬性名匹配XML元素的屬性名。

SetNextRule:離開匹配元素時調用,digester分析下一個棧頂對象,調用該對象的指定屬性的setter方法,將當前棧頂對象作為參數傳入到該方法,同時彈出當前棧頂對象。

SetTopRule:和SetNextRule含義相同,分析棧頂對象,調用該對象指定屬性的setter方法,將下一個棧頂對象作為參數傳給該方法(典型會被調用的方法是setParent)。

CallMethodRule:調用棧頂對象指定的方法。設置這個規則需要指出調用的方法名,參數個數,參數Java類型(可選),參數值一般是匹配元素的body content,用CallParamRule指定。

CallParamRule :標識CallMethodRule中的方法參數。參數值可能是匹配元素的某個屬性,或匹配元素的body content。

Digester的處理過程

Digester使用堆棧來存儲對象,當ObjectCreateRule被執行時,將對象壓入棧,像SetPropertiesRule,SetTopRule,CallMethodRule等規則都是對棧頂對象的操作。當SetNextRule被執行時,彈出棧頂對象,下一個棧頂對象成為棧頂對象,最后返回對象樹的根節點。

Digester詳細描述參見http://commons.apache.org/digester/commons-digester-1.8/docs/api/org/apache/commons/digester/package-summary.html#doc.Description

digester java_Java XML解析之Digester的使用相关推荐

  1. 一键解析XML文件(利用Digester实现可配置)

    大部分程序员,平时工作中除了与Bug相伴之外,想必也会很多种多样的文件打交道吧.当然,XML 就是其中之一,获取交互数据,创建规则等等,都离不开他.XML是个非常强大的描述语言,相比而言,txt之流则 ...

  2. digester java_利用Digester把XML转换为Java对象

    在一个比较完整的应用系统里,经常需要有一些配置文件.简单的属性使用.properties文件即可,但要配置一些复杂对象,则应该考虑使用xml文件.一般用来读取xml文件的工具包有DOM.SAX和JDO ...

  3. digester java_[jakarta-commons] 使用Digester解释xml获取java对象(代码入注规则 或 配置规则 任你选!)...

    # re: [jakarta-commons] 使用Digester解释xml获取java对象(代码入注规则 或 配置规则 任你选!) 2009-11-09 10:27 | Java小子 楼主,运行起 ...

  4. xml解析 java_Java的XML解析

    XML:(eXtensible Markup Language) 可扩展标记语言 是一种数据格式,用于存储和传输数据 声明一个xml文件 文档类型定义 book.dtd"> only: ...

  5. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

  6. c语言解析xml字符串_Python XML解析

    Python XML解析 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). 你可以通过本站学习XML教程 XML 被设计用来传输和存储数据. XML是 ...

  7. XML解析简介及Xerces-C++简单使用举例

    XML是由World WideWeb联盟(W3C)定义的元语言.它已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.XML在不同的语言里解析方式 ...

  8. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  9. C++ XML解析之TinyXML篇[转]

    最 近使用TinyXML进行C++ XML解析,感觉使用起来比较简单,很容易上手,本文给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完 成.以后的文章里会讲 ...

  10. Java XML解析器

    使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...

最新文章

  1. GitLab安装,导入,备份
  2. mysql-atlas安装及使用教程
  3. java i数据类型_数据类型 I
  4. 关于计算机视觉(随谈)
  5. 机器视觉 · 视觉系统选型
  6. 分享一个HTML5画布实现的超酷文字弹跳球效果
  7. 导览系统定制开发_联联周边游系统源码定制开发平台方案
  8. window系统对应默认IE浏览器版本
  9. 【luogu T34117 打油门】 题解
  10. 省市县三级联动sql数据
  11. 115怎么利用sha1下载东西_用于批量倾倒和提取的115 sha1工具
  12. c语言用if函数如何判断闰年,excel怎么用IF公式判断闰?
  13. TextView描边、渐变、阴影效果
  14. 背景图片随页面滚动放大缩小
  15. 分分钟掌握人脸识别:face_recognition模块
  16. 文章数据分析与自动分类
  17. [GWCTF 2019]pyre
  18. keil c语言pdf,Keil软件“C语言”与“汇编”混编 —— 相关知识整理.pdf
  19. linux 没有权限访问共享文件夹的问题
  20. 步科触摸屏HMI通过MODBUS RTU与ESP32通讯

热门文章

  1. 三菱q系列plc连接电脑步骤_SERVER和三菱Q系列PLC通讯设置步骤
  2. 西瓜数据集的各种版本,比如说2.0,3.0,4.0都在这
  3. 论文笔记:Securing Data With Blockchain and AI
  4. 超火动态表白H5源码
  5. flash写保护原理_Flash存储原理
  6. M1芯片Mac mini 2K显示器开启HiDpi
  7. shufflenet_v1
  8. 专题:固体力学中应力与应变分析详解(5.主方向与主应力)
  9. wpsmac和pc版的区别_办公得力小助手你选谁, WPS Mac版和Microsoft区别在哪里?
  10. ps6人脸识别液化工具在哪_ps液化工具在哪