Digester解释xml 两种rule方式

tomcat源码解析(三)——Digester类源码解析及Rule分析 在这篇文章中主要针对tomcat源码中Rule部分的解析;这部分功能主要涉及server.xml文件加载和tomcat容器中个组件初始化的过程,而且对于新手程序员来说理解过程较为复杂。在我之前的文章中《tomcat源码解析(一)——Bootstrap和Catalina启动部分》和《tomcat源码解析(二)——xml解析过程分析》分别对启动过程和xml解析进行了分析。 之前的文章中遗留了几个问题 阅读详情

Digester解释xml 两种rule方式

文章转自:http://gaolixu.iteye.com/blog/421717

java 代码:

 

ChartRegistry:
public class ChartRegistry
{
    List<ChartConfig> registry = new ArrayList<ChartConfig>();
    public void addChart(ChartConfig obj)
    {
        registry.add(obj);
    }
    
    public java.util.List<ChartConfig> getRegistry()
    {
        return registry;
    }

    public String toString() {
        return ReflectionToStringBuilder.reflectionToString(this,

ToStringStyle.MULTI_LINE_STYLE);
    }
}

 

图表设定器ChartConfig:
public class ChartConfig implements Comparable
{
    private String id;
    private boolean legendVisible;
    private String type;
    private int width;
    private String description;

    public String getDescription()
    {
        return description;
    }
    public void setDescription(String description)
    {
        this.description = description;
    }
    public String getId()
    {
        return id;
    }
    public void setId(String id)
    {
        this.id = id;
    }
    public boolean isLegendVisible()
    {
        return legendVisible;
    }
    public void setLegendVisible(boolean legendVisible)
    {
        this.legendVisible = legendVisible;
    }
    public String getType()
    {
        return type;
    }
    public void setType(String type)
    {
        this.type = type;
    }
    public int getWidth()
    {
        return width;
    }
    public void setWidth(int width)
    {
        this.width = width;
    }
    public String toString() {
        return ReflectionToStringBuilder.reflectionToString

(this,ToStringStyle.MULTI_LINE_STYLE);
    }
    public int compareTo(Object o)
    {
        if(o instanceof ChartConfig){
            ChartConfig o1 = (ChartConfig)o;
            return this.id.compareTo(o1.id);
        }
        return -1;
    }
}

 

图表数据设定(简化版)charts.xml:
<?xml version="1.0" encoding="GBK" ?>
<charts>
    <chart id="BarChart1">
        <legendVisible>false</legendVisible>
        <type>中国</type>
        <width>500</width>
        <description>11</description>
    </chart>
    <chart id="BarChart2">
        <legendVisible>true</legendVisible>
        <type>美国</type>
        <width>500</width>
        <description>22</description>
    </chart>
</charts>

 

配置规则设定rule.xml:
<?xml version='1.0'?>
<!DOCTYPE digester-rules
  PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN"
    "file:///../digester/dtds/digester-rules.dtd">

<digester-rules>
    <pattern value="charts">  <!-- 遇上charts节点时 -->
        <object-create-rule classname="study.jakarta.commons.digester.ChartRegistry" />  

<!-- 创建对象 -->
        <set-properties-rule /> <!-- 设置属性 -->
        <pattern value="chart"> <!-- 遇上charts节点时 -->
            <object-create-rule classname="study.jakarta.commons.digester.ChartConfig" />

<!-- 创建对象 -->
            <set-next-rule methodname="addChart"

paramtype="study.jakarta.commons.digester.ChartConfig"/> <!-- 调用定对象方法 -->
            <set-properties-rule /> <!-- 设置属性 -->
            <bean-property-setter-rule pattern="legendVisible" /> <!-- 调用对象的setter方

法 -->
            <bean-property-setter-rule pattern="type" />
            <bean-property-setter-rule pattern="width" />
            <bean-property-setter-rule pattern="description" />
        </pattern>
    </pattern>
</digester-rules>

 

跑一下试试看:
public class DigesterTest
{
    public static void main(String[] args)
    {
        try
        {
            String charts = "F:\\计算机\\jakarta-commons\\jakarta-commons-cookbook-code\

\examples\\study\\jakarta\\commons\\digester\\charts.xml";
            String rule="F:\\计算机\\jakarta-commons\\jakarta-commons-cookbook-code\

\examples\\study\\jakarta\\commons\\digester\\rules.xml";
            DigesterTest test= new DigesterTest();
            System.out.println("======================= getChartRegistryWithCodeRule

==========================");
            ChartRegistry c= test.getChartRegistryWithCodeRule(new File(charts));
            System.out.println(c);
            System.out.println("======================= getChartRegistryWithCodeRule

==========================");
            System.out.println(test.getChartRegistryWithFileRule(new File(charts),new

File(rule)));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    //代码中设定规则
    private ChartRegistry getChartRegistryWithCodeRule(File charts) throws IOException,

SAXException{
        
                InputStream is = new FileInputStream(charts);
                Digester digester = new Digester();
                digester.setValidating(false);//不进行XML与相应的DTD的合法性验证
                
                digester.push(new ChartRegistry());                         //创建一个

ChartRegistry对象, 你这样用这种形式建立顶对象(选用这种方式,注释下一行)
                //digester.addObjectCreate("charts", ChartRegistry.class);  //创建一个

ChartRegistry对象, 你也这样用这种形式建立顶对象(选用这种方式,注释上一行)
                digester.addSetProperties("charts");
                digester.addObjectCreate("charts/chart", ChartConfig.class); //当遇到

<chart>时创建一个ChartConfig对象
                digester.addSetProperties("charts/chart");  //根据<chart>元素的属性

(attribute),对刚创建的ChartConfig对象的属性(property)进行设置
                digester.addBeanPropertySetter("charts/chart/legendVisible");//当遇到

<chart>的子元素<legendVisible>时将子元素值设置为ChartConfig对象的legendVisible属性的setter

方法
                digester.addBeanPropertySetter("charts/chart/type");        //参考上面注释
                digester.addBeanPropertySetter("charts/chart/width");        //参考上面注

释
                digester.addBeanPropertySetter("charts/chart/description"); //参考上面注释
                digester.addSetNext("charts/chart", "addChart");        //当再次遇到

<charts>的子元素<chart>时调用顶对象的addChart方法。
                ChartRegistry c = (ChartRegistry)digester.parse(is);  //分析结束后,返回根

元素
                Collections.sort(c.getRegistry());
                return c;
    }
    
    //配置中设定规则
    private ChartRegistry getChartRegistryWithFileRule(File charts,File rule) throws

IOException, SAXException{
            Digester digester = DigesterLoader.createDigester(rule.toURL());
            ChartRegistry c = (ChartRegistry)digester.parse(charts);
            Collections.sort(c.getRegistry());
            return c;
    }
}

 

结果输出:
======================= getChartRegistryWithCodeRule ==========================
study.jakarta.commons.digester.ChartRegistry@16df84b[
  registry=[study.jakarta.commons.digester.ChartConfig@1aa57fb[
  id=BarChart1
  legendVisible=false
  type=中国
  width=500
  description=11
], study.jakarta.commons.digester.ChartConfig@763f5d[
  id=BarChart2
  legendVisible=true
  type=美国
  width=500
  description=22
]]
]
======================= getChartRegistryWithCodeRule ==========================
study.jakarta.commons.digester.ChartRegistry@18f6235[
  registry=[study.jakarta.commons.digester.ChartConfig@78a212[
  id=BarChart1
  legendVisible=false
  type=中国
  width=500
  description=11
], study.jakarta.commons.digester.ChartConfig@1d85f79[
  id=BarChart2
  legendVisible=true
  type=美国
  width=500
  description=22
]]
]

digester-rules NULL 博文链接:https://xy375149089.iteye.com/blog/1168899 立即下载

相关推荐

使用digester配置rule.xml规则来解析自定义的xml文件-代码

使用digester配置rule.xml规则来解析自定义的xml文件

Jakarta Commons Digester 简介和具体使用方法

 1.  Digester 就是让你配置一个 XML 转到 Java Object 对应的程序, 当一些 XML中特定的属性将会触发一些被称为 rules 的动作, 有一些属性是已经被定义好了,当然你也可以建立自己所需要的. 而 Digester 也包含了以下高级的特性 :    *能够嵌入你原本的对应方式, 而不会影响你的需求.    *自定义(Customized)的 namespac

xinqing6888的专栏 1159

解密m3u8视频合并:从猫抓插件到本地文件修改全流程

本文详细解析了m3u8视频合并的全流程,特别针对加密视频片段提供了解决方案。从使用猫抓插件捕获m3u8文件地址,到利用N_m3u8DL-CLI工具自动下载、解密并合并ts片段,手把手教你处理AES-128加密等常见问题,最终生成完整的本地MP4文件,适合需要备份或处理流媒体资源的用户。

weixin_29290947的博客 1360

digester解析rule详解

首先要搞清楚,digester是按栈(先进后出)的方式去解析rule的,即【先执行的代码后生效】 废话不多说,看实例的结构: 解析rule需要将xml文件和java对象关联起来,所有先创建两个java对象: //学校 public class School { String name; String address; //一座学校包含多个老师 List<Teache...

kshon的博客 1595

绕开华为通道,获取解锁码解锁BootLoader

刷机有风险,操作需谨慎,如果因为各种因素导致手机变砖无法开机,本教程概不负责,望悉知 前言 这篇文章的大多内容是根据我自己找的一篇文章《绕开华为通道,获取解锁码解锁BootLoader》来编写的,里面的大部分内容是文章的原内容。下面的都是我参考文章中做了一些小部分的修改,增加了我华为P8手机的一些操作,下面开始讲述我的解锁过程。 因为华为官方在2018年的七八月份吧,关闭了解锁码的申请通道,这...

Martin.Mu `s Special Column 5万+

四款办公Agent实测对比:WorkBuddy、千问办公、库库AI、豆包工作怎么选

AI Agent是一种能感知环境、自主决策并执行动作的智能系统,其核心在于工具调用、状态管理与错误恢复构成的执行闭环。在办公场景中,任务边界清晰、容错率高、重复性强,使Agent成为最容易落地的方向。通过调用本地文件、脚本或办公套件,Agent能自动完成文件批量处理、文档摘要、会议纪要等重复劳动,显著提升工作效率。目前WorkBuddy、千问办公、库库AI、豆包工作等产品分别从本地操作、办公套件嵌入、知识处理、轻量助手等路线切入,用户可根据自身场景选择。

weixin_29052717的博客 521

Digester的XML规则文件配置

在Digester中提供了一个包:org.apache.commons.digester.xmlrules。这个包中的类可以从一个XML文档中读取并返回一个指定的配置信息。XML文档配置文件必须使用DTD,这是xmlrules包的一部分。 下面是一个在这们例子中使用的XML规则的配置文件rules.xml。在看这个文件之前,我将有几点说明。 模式可以由两种不同...

xiuxian1的专栏 374

多租户Saas架构设计分析(基础篇)

本篇先给大家介绍一下相关的概念和常见问题。 实践篇链接:https://blog.youkuaiyun.com/haponchang/article/details/104246317 SaaS简介 SaaS是Software-as-a-Service(软件即服务)的简称,“软件即服务”?是不是有点拗口?其实你就理解成为“按需租用别人提供的软件服务”就可以了,它是一种软件交付模式。...

haponchang的博客 1万+

Digester的基于XML的规则集

用于Commons Digester的基于XML的规则集Commons Digester 1.6提供了将XML转化为对象的最简单的方法。Digester已经由OReilly网站上的两篇文章介绍过了:“学习和使用Jakarta Digester”,作者是Philipp K. Janert,和“使用Jakarta Commons, 第二部分”,作者是Vikram Goyal。两篇文章都演示了XML规

炼狱 2153

【迁移学习】域对抗迁移网络 DANN

Domain-Adversarial Training of Neural Networks

这个博客太懒了什么都没说 8416

【AI智能体】Codex 插件从使用到项目开发实战操作详解

Codex 插件从使用到项目开发实战操作详解

congge 7636

tomcat xml解析-digester

在tomcat里,digester就是。digester本来仅仅是Jakarta Struts中的一个工具,用于处理struts-config.xml配置文件。由于将XML文件转换成相应的Java对象是一项很通用的功能,后来又被移到了Apache Common项目中。但在Tomcat中并不依赖Apache common,而是将Digester源码包含了进来,并改变了包路径。

qq_32868023的博客 553

uniapp [全端兼容] - 实现连接蓝牙电子秤+监听数据转换并实时返回示例代码,uniApp实现BLE蓝牙连接多个电子秤设备、蓝牙通讯协议对接详细教程(全平台兼容H5、微信小程序、苹果安卓App)

uniapp连接蓝牙电子秤,uniapp如何连接电子秤蓝牙,蓝牙称重,实现监听数据转换并实时返回,多蓝牙,uni-app电子秤16进制蓝牙通讯协议对接,uniapp微信小程序蓝牙获取电子秤的值,uniapp蓝牙称重电子秤,蓝牙电子秤硬件,APP端连接蓝牙秤获取重量实时显示在页面上蓝牙秤,插件组件,蓝牙连接失败,uniapp安卓苹果ios连接蓝牙电子秤没反应,uniapp微信小程序 蓝牙低功耗连接发送数据监听接收,uni-app小程序蓝牙连接、读写数据全过程,uniapp连接蓝牙体脂秤,蓝牙搜索不到怎么办,如

🏆 前端领域优质创作者 1万+

xml | Digester

SAX和DOM的区别是什么?SAX使用基于event的处理来阅读XML文档, 它由回调机制实现.当解析器阅读文档的时候,每个解析事件都导致与这个事件相关的特定方法的调用,如认出元素的开始和结束.但是,SAX本身不是XML文档解析器.它是对XML解析器接口的公有域定义,在这里解析器是外部程序.SAX API的公有域部分存在于作为JDK一部分的3个程序包

1119

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java digester_digester解析xml文件

在我们的项目中或多或少会采用xml来做配置文件,你可以采用Java原生支持的sax、DOM或者第三方的dom4j等。虽然提供了各式各样的解析方式,但是解析一个复杂的xml所编写的Java代码是非常麻烦的,尤其是当xml做了修改,你会发现你又要修改Java代码。Apache的commons项目中Digester项目解决了这个问题,它可以很轻易地将xml文件解析成Java对象,让你直接去使用,而你仅仅...

weixin_31578739的博客 363

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Tomcat之XML解析器Digester

Catalina中使用Digester解析XML(server.xml)配置文件并创建应用服务器。 Digester是一款用于将XML转换为Java对象的事件驱动型工具,是对SAX的高层次封装,它提供了更加友好的接口,隐藏了XML节点具体的层次细节,使开发者可以更加专注于处理过程。 Digester最早作为Appache Struts的一部分,后来考虑其通用性,将其移动到了Appache Co...

上善若水 779

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Digester的基本用法

Digester类用来将XML映射成Java类,简化XML的处理。它是Apache Commons库中的一个jar包:common-digester包 引用方式import org.apache.commons.digester.Digester;  Digester类通过模式(pattern)和规则来处理XML文档。其中的模式必须匹配XML元素,即XML文档树中的节点名和位置。Digeste

shang的博客 8125

Digester解析Xml 原理

注:本文的内容没有涉及每个细节,希望读者可以在阅读的同时翻看源码,文章的内容为作者个人理解,希望达到抛砖引玉的效果。也希望可以得到大家的拍砖,多做交流。   提起xml解析,脑海里第一反应一定是Dom,SAX等方式,刚开始学习Java的时候我也是使用这两种方式进行解析,拿到一个Xml第一反应一定是“又要写if-else了”。在学习Tomcat过程中发现了一个组件Digester,用于解析x...

Michael Chu 374

Digester 类解析 xml 文件

一般用来读取xml文件的工具包有DOM、SAX和JDOM等,但用过的人都知道,它们属于比较底层的API,写起来代码量很大,而且如果修改了xml文件的格式,代码也要做大幅度的改动。而使用Apache Jakarta的Digester,解析XML文件非常方便且不需要过多的关心底层的具体解析过程。Digester本来仅仅是Jakarta Struts中的一个工具,用于处理struts-config.

阶段丶成长的博客 474

commons-digester使用

digester组件简化了xml文件处理操作,能将xml文件按照事先确定的规则(采用编码形式或xml配置文件形式),映射成java对象。digester组件现在最新版本是2.0,它所依赖的组件是:commons-logging(推荐1.1版本),BeanUtils(推荐1.8版本),还有需要jdk1.5. 基本概念 1. 在Digester的内部采用SAX来解析XML文件。为了能够正确

jiutianhe的专栏 3400

java digester_Digester

Digester是apache的一个xml解析工具。最近研究struts1源码时候才发现这东西挺好用的,可以很轻松的把XML转化成java对象。上代码publicclassAcptrule{privateStringid;privateListrules=newArrayList();publicStringgetId(){returnid;}publicvoidset...

weixin_34173656的博客 254

digester解析器解析xml(java)

rule.xml的DTD    http://jakarta.apache.org/commons/digester/dtds/digester-rules.dtd"> 例如要解析                                                                                    这个xml文

a17909863341的专栏 371

Jakarta Commons——Digester

主要用于由xml生成java对象。基本原理是:使用pattern匹配特定的节点,构造对象,并执行rule定义的操作。 Pattern使用xpath匹配节点,是从根目录开始,只有一个例外:*/name will match a element anywhere in the document. 使用步骤 1)创建digester的实例;2)config it ; 3) 指定pattern和r

dananhai381的专栏 728
上一篇: Myeclipse启动的默认空间设置
下一篇: Class.getResource与Class.getClassLoader.getResource
阳小良
博客等级 码龄17年 54粉丝 155原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值