`
陈修恒
  • 浏览: 204642 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

包装dom4j.Element的一个工具类

    博客分类:
  • java
阅读更多
1、忽略掉xml标签的大小写。
2、调用setter方法,将xml元素属性注入到BEAN。

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Attribute;
import org.dom4j.DocumentException;
import org.dom4j.Element;

public class ElementWrapper {
    protected Log logger = LogFactory.getLog(getClass());
 

    /** 基本类型到包装类型的映射 **/
    private static Map<Class, Class> wrapperClassMap = new HashMap<Class, Class>(){{
        put(boolean.class, Boolean.class);
        put(int.class, Integer.class);
        put(double.class, Double.class);
        put(long.class, Long.class);
        put(short.class, Short.class);
        put(float.class, Float.class);
        put(byte.class, Byte.class);
        put(char.class, Character.class);
    }};
    
    /**
     *<pre>
     *  调用 targetBean 的普通setter方法,将configElement中的属性值反射到 targetBean 中
     *  注意: Element 中属性的名称必须在 targetBean 中有seter方法,且不区分大小写
     *</pre>
     * @param targetBean    目标 Bean
     * @param configElement  标签对象
     * @author 陈修恒 2011-3-21
     * @throws DocumentException 
     */
    protected void invokeNode (Object targetBean, Element configElement) throws DocumentException {
        if (logger.isDebugEnabled()) {
            logger.debug("开始调用:" + targetBean.getClass().getSimpleName() + "#setter方法");
        }

        /** 获取这个节点的所有setter方法 */
        Map<String, Method> methodMap = new HashMap<String, Method>();
        Method[] methods = targetBean.getClass().getMethods();
        for (Method method : methods) {
            if (method.getName().indexOf("set")==0
                    && method.getParameterTypes().length == 1) {
                methodMap.put(
                        method.getName().toLowerCase().substring(3),
                        method);
            }
        }

        /** 调用set,属性写入 */
        for (Attribute attribute : (List<Attribute>)configElement.attributes()) {
            String methodName = attribute.getName().toLowerCase();
            String value = attribute.getValue();
            
            Method method = methodMap.get(methodName);
            
            /** 如果有属性的配置为 isXXX,去掉前面的is */
            if (method == null 
                   && 0 == methodName.indexOf("is")) {
                method = methodMap.get(methodName.substring(2));
            }
            
            if (method != null
                    && value != null
                    && value.length() != 0) {

                /** 参数类型 */
                Class<?> paramType = method.getParameterTypes()[0];
                
                try {
                    Object param = null;

                    if (paramType.equals(char.class)) {
                        param = value.charAt(0);
                    } else if (paramType.equals(String.class)){
                        param = value;
                    } else { 
                        if (paramType.isPrimitive()) { // 是基本类型,获取他的包装类型
                            paramType = wrapperClassMap.get(paramType);
                        }
                        
                        /** 调用本类型的String构造函数 */
                        Constructor<?> cons = paramType.getConstructor(String.class);
                        param = cons.newInstance(value);
                    }
                    
                    /** 调用setter (String) 方法 */
                    method.invoke(targetBean, param);
                    
                    if (logger.isDebugEnabled()) {
                        logger.debug("成功调用:"+ getMethodInfo(targetBean, method)+", 参数:"+ param);
                    }

                    /** 将该方法删除 */
                    methodMap.remove(method.getName().toLowerCase().substring(3));
                } catch (Exception e) {
                    logger.error(e.getMessage(), e);
                    throw new DocumentException(e.getMessage());
                }
                
                
            } else if (logger.isDebugEnabled()) {
                logger.debug(targetBean.getClass().getSimpleName() + "不存在setter方法, 属性名:" + methodName);
            }
            
        }
        

        if (!methodMap.isEmpty() && logger.isDebugEnabled()) {
            for (Method m : methodMap.values()) {
                String methodInfo = getMethodInfo(targetBean, m);
                logger.debug(
                        "没有调用:" + methodInfo
                        );
            }
            
        }
    }

    /**
     *<pre>
     *
     *</pre>
     * @param targetBean
     * @param m
     * @return
     * @author 陈修恒 2011-3-30
     */
    private String getMethodInfo(Object targetBean, Method m) {
        String methodString = m.toString();
        
        int setIndex = methodString.lastIndexOf(".set");
        
        String methodInfo = targetBean.getClass().getSimpleName() +
                                "#"+methodString.substring(setIndex+1);
        return methodInfo;
    }
    
    /**
     *<pre>
     * 将 Element 配置的属性名,全改成小写
     *</pre>
     * @param el
     * @return
     * @author 陈修恒 2011-3-28
     */
    public Map<String, String> attributes(Element el) {
        Map<String, String> map = new HashMap<String, String>();
        for (Attribute attri : (Collection<Attribute>)el.attributes()) {
            map.put(attri.getName().toLowerCase(), attri.getValue());
        }
        
        return map;
    }
    
    /**
     *<pre>
     *   获取子标签列表
     *</pre>
     * @param rootElement 父标签
     * @param elementName 子标签名称
     * @return
     * @author 陈修恒 2011-3-28
     */
    public List<Element> elements (Element rootElement, String elementName) {
        List<Element> elementRst = new ArrayList<Element>();
       
        /** 获取父节点下的所有子节点 */
        List<Element> elements = rootElement.elements();
       
        /** 帅选出名称与指定名称相同的标签,忽略大小写 */
        for (Element element : elements) {
            if(elementName.equalsIgnoreCase(element.getName())) {
                elementRst.add(element);
            }
        }
        return elementRst;
    }
    
    
    /**
     *<pre>
     *   获取子标签列表
     *</pre>
     * @param rootElement 父标签
     * @param elementName 子标签名称
     * @return
     * @author 陈修恒 2011-3-28
     */
    public Element element (Element rootElement, String elementName) {
        List<Element> elementRst = elements(rootElement, elementName);
        
        if (elementRst.isEmpty()) {
            return null;
        } else {
            return elementRst.get(0);
        }
    }
}

分享到:
评论

相关推荐

    dom4j.jar 下载

    DOM4J是一个强大的Java库,专门用于处理XML文档。它是一个灵活且高性能的XML解析器,提供了丰富的API来创建、修改和操作XML数据。在Java应用程序中,DOM4J作为一个流行的选择,尤其在处理复杂的XML结构时,因为它...

    dom4j的使用+dom4j.jar

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而直观的API,使得开发者可以方便地读取、创建、修改以及遍历XML文档。在这个教程中,我们将深入探讨DOM4J的核心功能和使用方法,同时也会涉及到如何...

    dom4j.jar包,java解析xml dom4j.jar包

    - **DOM阅读器**:首先,通过`DocumentFactory.createDocument()`方法创建一个`Document`对象,然后使用`read()`方法读取XML文件,将整个XML文件加载到内存中形成一个树形结构。这种方式适合小型XML文档,因为所有...

    使用dom4j将xml字符串转换成Bean对象

    当我们需要将XML字符串解析并映射到Java Bean对象时,dom4j是一个常用的库。本篇文章将详细探讨如何使用dom4j库实现这个过程。 首先,dom4j是一个强大的Java XML API,它提供了丰富的功能,如读取、写入、修改和...

    java Dom4j 无敌连环解析XML工具类

    在本教程中,我们将深入探讨如何使用DOM4J来解析XML文件,并创建一个无敌连环解析工具类。 首先,我们需要了解XML的基本概念。XML(可扩展标记语言)是一种标记语言,常用于数据交换和存储。它的结构化特性使其非常...

    java读写xml文档_dom4j.jar

    本主题将专注于DOM4J库,它是一个灵活且功能强大的Java XML API,用于读取、写入、操作和导航XML文档。DOM4J.jar是这个库的实现,它提供了比标准DOM更高效、更易于使用的API。 DOM4J的使用主要围绕以下几个核心概念...

    dom4j使用教程+dom4j.jar

    在提供的压缩包中,包含了`dom4j.jar`文件,这是DOM4J的运行库,包含了所有DOM4J的类和接口。在实际项目中,只需将这个JAR文件添加到项目的类路径中,就可以使用DOM4J处理XML了。 总结来说,DOM4J是Java开发中处理...

    dom4j-2.1.3.zip

    总结来说,DOM4J 2.1.3是一个强大且易用的XML处理工具,它的API文档和源代码为开发者提供了便利的学习和开发环境。无论你是XML初学者还是资深开发者,DOM4J都能成为你处理XML任务的得力助手。通过深入学习和实践,你...

    dom4j-2.0.3.zip

    DOM4J,作为一个强大的Java XML API,是处理XML文档的主流工具之一。它提供了一套简单而高效的方式来操作XML文档,包括读取、写入、修改和遍历XML结构。在Java开发中,DOM4J因其灵活的API设计和出色的性能而广受欢迎...

    dom4j.zip压缩包

    - **创建XML**:DOM4J提供了便捷的API来创建XML文档,如`DocumentFactory`用于创建新的文档对象,`Element`类用于创建元素,`Attribute`类用于添加属性。 - **修改XML**:通过`Element`的`addContent()`、`remove...

    dom4j所依赖的所有jar包

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而直观的API,使得开发者可以方便地读取、写入、修改以及操作XML文件。DOM4J 1.6.1是这个库的一个稳定版本,发布于较早时期,但依然广泛应用于许多Java...

    dom4j.jar,dom,xml,dom4j

    如果你正在处理XML文档,无论是进行简单的读取还是复杂的转换操作,DOM4J都是一个值得信赖的工具。在Java项目中,只需将dom4j-1.6.1.jar添加到类路径,就可以立即开始利用其强大的XML处理能力。 总之,DOM4J是Java...

    Jdom.chm & Dom4j.chm帮助文档

    DOM4J则是另一个流行的XML处理库,它提供了更高级的功能和更多的选择: 1. **灵活性**:DOM4J不仅支持DOM,还支持SAX和STAX解析器,可以根据需求选择最适合的解析方式。 2. **XPath支持**:DOM4J内置了XPath表达式...

    dom4j 工具类 使用例子

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单且高效的API,使得开发者能够轻松地读取、写入、修改以及操作XML文件。在这个"dom4j工具类使用例子"中,我们将深入探讨如何利用DOM4J进行XML处理。 ...

    Dom4j+Dom的jar包

    总之,DOM4J和DOM都是处理XML的重要工具,它们各有优缺点,选择使用哪一个取决于具体项目的需求。DOM4J提供了更高级的功能和更好的性能,而DOM则作为标准方案保持着广泛的兼容性。在实际开发中,理解它们的工作原理...

    dom4j 工具类

    **DOM4J工具类详解** DOM4J是一个强大的Java XML API,它提供了全面的XML处理功能,包括解析、操作和生成XML文档。DOM4J在Java社区中被广泛使用,因其简洁的API和高效的性能而受到青睐。在这个文档中,我们将深入...

    使用Maven管理项目,实现DOM4j操作XML文件

    2. **创建XML文件**:使用DOM4j创建一个新的XML文件,这通常涉及到`Document`、`Element`和`Writer`的使用。例如,你可以创建一个包含根元素和子元素的XML文件。 3. **动态创建XML节点**:在已有的XML文档中动态...

    dom4j解析xml

    总结来说,DOM4J为开发者提供了一套完整的工具来解析、操作和创建XML文档。无论是简单的文件读写还是复杂的XML文档构建,DOM4J都能胜任。希望本教程能够帮助大家更好地理解和掌握DOM4J的应用技巧。

    dom4j-1.6.1.jar

    DOM4J是一个强大的Java库,专门用于处理XML文档。它是一个灵活且高性能的XML解析器,提供了丰富的API来创建、修改和操作XML内容。在Java世界中,DOM4J是继JDOM之后的一个非常受欢迎的选择,它弥补了标准Java DOM API...

    dom4j工具类

    **DOM4J工具类详解** DOM4J是一个强大的Java XML处理库,它提供了一套灵活且功能丰富的API,使得在Java应用程序中解析、创建、修改XML文档变得异常简单。DOM4J的名字来源于“DOM for Java”,它是一个基于DOM模型的...

Global site tag (gtag.js) - Google Analytics