Digester 空白保留问题

本文介绍了使用Apache Commons Digester解析XML文件时遇到的问题及其解决方案,特别是如何处理元素文本中的空白字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Digester 详细介绍 : apache common digester    ,这里描述一个常见问题的解决方案

 

问题:

 

Digester 作为 SAX 解析 xml 的实现,它的原理就是制定一些规则,在遍历每个节点时检查是否有匹配的规则,如果有就执行对应的操作 。

比如:

 

  InputStream is = new FileInputStream(file);
  Digester digester = new Digester();
  digester.push(this);
  digester.setValidating(false);
  digester.addObjectCreate("level1", Level1.class);
  digester.addBeanPropertySetter("level1/property","property");
  digester.addSetNext("level1","register");
  digester.parse(is);

 这段代码即遇见level1标签就就新建 Level1 实例对象 L,并把 property 子标签的标签值付给 L 对象的 property 属性。这里就遇到了空格问题,如果property 子标签中前后有空白,可以实验得到 L对象的property属性是trim过后的值,如果想要保留空白呢?

 

 

分析:

 

  由于 digester 的一个动作对应一个rule,则看一下 addBeanPropertySetter 的实现:

 

 public void addBeanPropertySetter(String pattern,
                                      String propertyName) {
        addRule(pattern,new BeanPropertySetterRule(propertyName));
  }
 

那么可以看一下 BeanPropertySetterRule 的实现 ,首先知道 rule 通过其 body 方法来得到标签内的字符串值,则可以看一下 body 方法 :

 

/**
     * Process the body text of this element.
     *
     * @param namespace the namespace URI of the matching element, or an 
     *   empty string if the parser is not namespace aware or the element has
     *   no namespace
     * @param name the local name if the parser is namespace aware, or just 
     *   the element name otherwise
     * @param text The text of the body of this element
     */
    public void body(String namespace, String name, String text)
        throws Exception {
        // log some debugging information
       if (digester.log.isDebugEnabled()) {
            digester.log.debug("[BeanPropertySetterRule]{" +
                    digester.match + "} Called with text '" + text + "'");
        }
        bodyText = text.trim()
    }
 

可见,由 rule 获得 标签值是已经 trim 过的,当然就没有办法了么?

 

 

解决:

 

自定义rule


由于系统自带的所有rule都是继承自 rule ,而实现一些公共接口,而现在要求和 BeanPropertySetterRule 没什么区别,只不过要求 body 方法不要对值进行 trim,则可以自己写个rule :

 

public class BeanPropertySetterRuleWhiteSpace extends Rule {
     //......省略
   public void body(String namespace, String name, String text)
        throws Exception {
        //不要 trim
        bodyText = text;
    }
}

 

那么根据 addBeanPropertySetter 的调用,可以这样子写了 :

 

 

digester.addBeanPropertySetter("level1/property","property");

==

digester.addRule("level1/property",new BeanPropertySetterRuleWhiteSpace("property"));

 

则最终解析得到的 Level1 实例的 property 属性前后空格得以保存。


 

资源下载链接为: https://pan.quark.cn/s/3d8e22c21839 随着 Web UI 框架(如 EasyUI、JqueryUI、Ext、DWZ 等)的不断发展与成熟,系统界面的统一化设计逐渐成为可能,同时代码生成器也能够生成符合统一规范的界面。在这种背景下,“代码生成 + 手工合并”的半智能开发模式正逐渐成为新的开发趋势。通过代码生成器,单表数据模型以及一对多数据模型的增删改查功能可以被直接生成并投入使用,这能够有效节省大约 80% 的开发工作量,从而显著提升开发效率。 JEECG(J2EE Code Generation)是一款基于代码生成器的智能开发平台。它引领了一种全新的开发模式,即从在线编码(Online Coding)到代码生成器生成代码,再到手工合并(Merge)的智能开发流程。该平台能够帮助开发者解决 Java 项目中大约 90% 的重复性工作,让开发者可以将更多的精力集中在业务逻辑的实现上。它不仅能够快速提高开发效率,帮助公司节省大量的人力成本,同时也保持了开发的灵活性。 JEECG 的核心宗旨是:对于简单的功能,可以通过在线编码配置来实现;对于复杂的功能,则利用代码生成器生成代码后,再进行手工合并;对于复杂的流程业务,采用表单自定义的方式进行处理,而业务流程则通过工作流来实现,并且可以扩展出任务接口,供开发者编写具体的业务逻辑。通过这种方式,JEECG 实现了流程任务节点和任务接口的灵活配置,既保证了开发的高效性,又兼顾了项目的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值