`
yiminghe
  • 浏览: 1466704 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Digester 空白保留问题

    博客分类:
  • java
阅读更多

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 属性前后空格得以保存。


 

0
0
分享到:
评论

相关推荐

    digester解析xml的问题.pdf

    Digester 是 Apache Commons 中的一个工具类库,它用于解析 XML 文档,并根据预先定义的规则自动创建和配置 Java 对象。在上述问题中,我们看到一个 XML 文档表示了一个考试,其中包含了多个题目,每个题目有其编号...

    Digester

    Digester是Apache软件基金会下的Jakarta项目中的一个Java库,主要用于简化XML到Java对象的映射过程。在处理XML文档时,它通过匹配XML元素结构到相应的Java对象的方法调用,实现了XML解析的自动化。这个工具对于那些...

    digester用法测试案例

    Digester是Apache软件基金会的Jakarta项目中的一个实用工具库,它主要用来解析XML文档,并根据预定义的规则自动创建和配置Java对象。这个工具在处理XML到Java对象映射时,极大地简化了代码,避免了手动解析XML的繁琐...

    Digester解析XML问题.pdf

    Apache Commons Digester是一个用于将XML数据映射到Java对象的工具,主要应用于处理XML配置文件或数据文件。它通过定义一系列的模式和规则,能够自动地创建和填充Java对象的结构,大大简化了XML解析的过程。 ...

    Castor、digester实例

    Castor和Digester是两个在Java开发中用于对象与XML数据之间进行映射的库,它们简化了XML数据的解析和对象的序列化过程。在本文中,我们将深入探讨这两个库,以及如何通过实例来使用它们。 首先,让我们了解Castor。...

    Digester java解析xml

    Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...

    commons-digester-2.1.jar

    4. **编译问题**:如果在Maven构建过程中出现了问题,例如网络不稳定导致部分依赖未下载完整,也可能造成`commons-digester-2.1.jar`无法正常使用。 为了解决这个问题,你可以尝试以下步骤: 1. **检查POM.xml**:...

    digester使用

    《digester深度解析》 Java世界中,XML作为数据交换和配置文件的常用格式,其解析和对象绑定是一项常见的任务。...然而,使用过程中也需要注意规则的合理设置、错误处理以及性能问题,以实现高效稳定的XML解析。

    commons-digester.jar

    当你遇到`java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet`这样的错误时,这意味着你的应用程序运行环境中缺少了Apache Commons Digester库,需要引入`commons-digester.jar`来解决这个问题。...

    commons-digester3-3.2-API文档-中英对照版.zip

    赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...

    Digester读取xml教程.rar

    Digester提供了错误处理机制,当解析过程中遇到问题时会抛出异常。同时,通过配置日志系统,如Log4j,可以获取详细的解析过程信息。 8. **实际示例** 以一个简单的用户信息XML为例,我们可以定义如下规则: - 当...

    Digester两种解析方式

    为了解决硬编码规则的可读性和可维护性问题,Digester还支持从外部XML文件加载规则。这种方式将解析逻辑与业务逻辑分离,使得代码更清晰,易于维护。规则文件通常采用DOSCH(Digester Object Creation and Setup How...

    利用commons-digester解析xml

    标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...

    digester组件简化了xml文件处理操作

    ### Digester组件简化XML文件处理操作 #### 一、引言 随着Web技术的发展,XML作为数据交换格式的重要性日益凸显。然而,对于大型且复杂的XML文档进行解析与处理时,传统的方法如DOM(Document Object Model)和SAX...

    XML的解析之——使用Digester

    本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...

    digester3.2 源码

    《digester3.2源码解析与应用实例》 Apache Digester是一个强大的Java库,用于在XML文档和Java对象之间建立映射关系,通过规则来自动解析XML并创建或更新对象结构。在digester3.2版本中,我们能够深入理解其内部...

    Digester 实例

    ### Digester 实例详解 #### 一、Digester 概述 Digester 是一个非常实用且功能强大的 XML 解析工具,它属于 Jakarta 开源项目下的 Commons 子项目之一。通过 Digester,开发者能够轻松地解析复杂的 XML 文件,而...

    digester包

    《digester包:XML解析利器》 在Java开发中,处理XML数据是一项常见的任务,而Apache ...在使用digester时,理解其工作原理和规则的设定至关重要,这将帮助我们更好地利用这一工具,解决实际开发中的XML处理问题。

    使用Apache_Commons_Digester

    ### 使用Apache Commons Digester开发指南 #### 概述 Apache Commons Digester 是一款基于 Java 的开源库,专门用于简化 XML 文件解析的过程。它利用 SAX(Simple API for XML)解析器来解析 XML 数据,并通过一...

    digester jar 包

    当解析过程中遇到问题时,如XML格式错误或无法匹配的规则,它会抛出相应的异常,便于开发者调试和定位问题。 6. **性能考虑** 由于Digester基于SAX解析器,所以它对内存的占用相对较小,适合处理大文件。但需要...

Global site tag (gtag.js) - Google Analytics