`
sha1064616837
  • 浏览: 40223 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

dom4j解析XML成对象

阅读更多
  最近不太忙,发现现在服务之间的交互都是通过xml进行的,所以今天理了一下xml的两种解析方式。首先是最流行的dom4j解析。先解析,然后通过反射转成对象。
用到的jar:dom4j-1.6.1.jar jaxen-1.1.1.jar
1.xml字符串转成对象:
   /** 
     * 解析XMl字符串数据,转化成对象,并返回 
     * @param xml xml字符串数据 
     * @param xpathPattern xpath的匹配模式;具体语法请查XPath的语法 
     * @param classType 要转化对象的类型 
     * @return 返回用xml数据实例化之后的对象 
     */  
 @SuppressWarnings({ "unchecked", "rawtypes" })
    public static Object parseXmlStr(String xml, String xpathPattern, Class classType)  
    {  
        try  
        {  
            Document doc = DocumentHelper.parseText(xml);  
            List nodes = doc.selectNodes(xpathPattern);  
//          Element root = doc.getRootElement();  
//          List nodes = root.selectNodes("user");
            List objs = new ArrayList();  
            for(Node node : nodes)  
            {  
                Map map = traverse(node);  
                if(classType == String.class)  
                {  
                    objs.add(map.values().toArray()[0]);  
                }  
                else  
                {  
                    objs.add(nodeToBean(map, classType));  
                }  
            }  
            return objs;  
        }  
        catch(Exception e)  
        {  
        e.printStackTrace();
            return null;  
        }  
    } 

2.解析xml文件转成对象:
/** 
     * 解析XMl文件,转化成对象,并返回 
     * @param xmlPath:xml文件路径(绝对路径) 
     * @param xpathPattern xpath的匹配模式;具体语法请查XPath的语法 
     * @param classType 要转化对象的类型 
     * @return 返回用xml数据实例化之后的对象 
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
 public static Object parseXmlFile(String xmlPath, String xpathPattern, Class classType)  
    {  
        try {
        SAXReader reader = new SAXReader();  
 Document doc = reader.read(new File(xmlPath));
 List nodes = doc.selectNodes(xpathPattern);  
            List objs = new ArrayList();  
            for(Node node : nodes)  
            {  
                Map map = traverse(node);  
                if(classType == String.class)  
                {  
                    objs.add(map.values().toArray()[0]);  
                }  
                else  
                {  
                    objs.add(nodeToBean(map, classType));  
                }  
            }  
            return objs; 
 } catch (DocumentException e) {
 e.printStackTrace();
 return null;
 } catch (Exception e) {
 e.printStackTrace();
 return null;
 } 
    }

3.用到的辅助方法:
   /** 
     * 从找出的Node节点开始,遍历所有子节点,获取子节点的数据 
     * @param node:Node节点 
     * @return 返回节点的值 
     */  
    private static Map traverse(Node node)  
    {  
        Map map = new HashMap();  
        if(node instanceof Element)  
        {  
            map = treeWalk((Element)node, map);  
        }  
        else  
        {  
            map.put(node.getName(), node.getText());  
        }  
        return map;  
    }  
      
    /** 
     * 递归法提取节点的值 
     * @param element: 节点 
     * @param map: 保存节点的值 
     */  
    private static Map treeWalk(Element element, Map map)  
    {  
    //遍历该元素自身的属性
    int as= element.attributeCount();
    for(int j=0;j map, Class classType) throws Exception
    {  
        Field[] fields = classType.getDeclaredFields();//返回该类型的所有子属性(包含他继承的类和接口的)  
 Object obj = classType.getConstructor().newInstance();//创建该类型的实例
        for(Field field : fields)  
        {  
            //属性名  
            String fieldName = field.getName();  
            if(!map.containsKey(fieldName))  
            {  
                continue;  
            }  
            //因为解析出来都是String类型的,所以创建一个String类型转换成field.getType类型的构造器
            Constructor> con = field.getType().getConstructor(String.class);//
            Object param = con.newInstance(map.get(fieldName));//通过构造器把字符串转换成field.getType类型的实例
            fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);//首字母大写
            //根据方法的命名规范,获取该属性的set方法  
            String methodName = "set" + fieldName;  
            Method method = classType.getMethod(methodName, field.getType());//获取setter方法把值set到对象实例中
            method.invoke(obj, param);  
        }  
        return obj;  
    } 

4.测试方法:
public static void main(String[] args) {
 String xml = ""+
 "123345"+
 "duansha0327duansha"+
 "zhangdaihaomima"+
 "";
 String xmlPath = "D:/testXml/user.xml";
// List us = (List) Dom4jXml.parseXmlStr(xml, "/users/user[last()]", User.class);
 List us = (List) Dom4jXml.parseXmlFile(xmlPath, "/users/user[last()]", User.class);
 if(null != us && us.size()>0)
 {
 for(User u:us)
 {
 System.out.println("Id="+u.getId()+" ;userName="+u.getUsername()+" ;passWord"+u.getPassword());
 }
 }
 else
 {
 System.out.println("解析失败...");
 }
 }

5.XPath的语法参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp
分享到:
评论

相关推荐

    dom4j解析xml详解

    ### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...

    dom4j解析xml文件的压缩包

    5. **事件驱动解析(SAX)**:除了传统的DOM解析外,DOM4J还支持SAX解析器,这种解析方式适用于处理大型XML文件,因为它不需要一次性加载整个文档到内存。 6. **Namespace支持**:DOM4J提供了对XML命名空间的全面...

    java dom4j解析xml

    Java DOM4J解析XML是一种常见的处理XML文档的技术,它提供了灵活且高效的API,使得开发者能够方便地读取、写入、修改以及操作XML文件。DOM4J是Java中一个非常强大的XML处理库,它结合了DOM、SAX和JDOM的优点,同时也...

    DOM4J 解析XML

    **DOM4J解析XML** DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活、高效且功能丰富的API,使得XML的读取、创建、修改和查询变得简单易行。DOM4J的主要特点包括对XPath的支持、事件驱动的解析、以及与...

    dom4j解析xml文件(增删改查)

    在“dom4j解析xml文件(增删改查)”这个主题中,我们将深入探讨如何使用DOM4J来实现XML文档的四种基本操作:增加元素、删除元素、更新元素内容以及查询元素。 首先,让我们了解DOM4J的基本用法。在解析XML文件时,...

    dom4j解析xml

    **DOM4J解析XML** DOM4J是一个Java库,它为处理XML提供了强大的功能,包括读取、写入、修改和操作XML文档。这个库以其灵活性、效率和易用性而受到开发者的青睐。DOM4J是基于DOM(Document Object Model)的,但它...

    dom4j解析XML所需jar包

    7. **JAXB集成**:虽然DOM4J主要用于XML处理,但它也可以与Java Architecture for XML Binding(JAXB)配合,将XML数据映射为Java对象,反之亦然。 在使用DOM4J时,通常还需要依赖其他库来增强其功能。例如,`jaxen...

    dom4j 解析xml实例

    在这个实例中,我们将深入探讨如何使用DOM4J解析XML文件,并通过`Dom4jTest1.java`这个示例程序来理解其工作原理。 首先,我们需要了解XML(Extensible Markup Language)是一种标记语言,常用于存储和传输数据。...

    dom4j 解析(读取) xml 节点数据

    在本教程中,我们将深入探讨如何使用DOM4J解析(读取)XML节点数据,不受XML层级的限制。 首先,确保你已经下载了必要的依赖,即DOM4J库。通常,这将是一个名为`dom4j-x.x.x.jar`的文件,其中x.x.x是DOM4J的版本号...

    dom4j解析xml文件代码示例

    在本示例中,我们将深入探讨如何使用DOM4J解析XML文件,以`CacheInit.java`作为我们的核心代码示例,并参考`emailTemplateConfig.xml`作为实际操作的对象。 首先,让我们了解XML(eXtensible Markup Language)。...

    dom4j解析xml,利用反射机制

    通过这种方式,我们可以利用DOM4J解析XML文件,同时借助Java反射机制将解析结果动态地映射到自定义的Java类中。这在处理XML数据时提供了很大的灵活性,尤其在需要将XML数据与业务对象关联时,反射机制显得尤为重要。

    DOM4J解析XML代码

    在使用DOM4J解析XML文件之前,需要导入DOM4J相关的jar包,通常版本为1.6.1。 #### DOM4J常用对象 - **SAXReader**: 用于读取XML文件,并将其转换成Document对象。 - **Document**: XML文档对象树,类似于HTML文档...

    使用dom4j解析XML

    【使用dom4j解析XML】 dom4j是一个强大的开源XML框架,它提供了处理XML文档的各种功能,包括解析、创建、修改等。相比W3C DOM API,dom4j的优势在于其内置的XPath支持,允许更方便地定位和操作XML文档中的节点。 *...

    java dom4j 解析xml的例子,可用

    1. **DOM4J解析XML**:DOM4J通过创建一个可操作的树形结构来表示XML文档,这棵树称为文档对象模型。解析XML时,DOM4J首先读取XML文件并构建一个节点结构,然后你可以通过API遍历和修改这个结构。例如,你可以通过...

    dom4j解析XML所需要的jar包

    为了在Java项目中使用DOM4J解析XML,你需要将这两个jar文件(dom4j-1.6.1和jaxen-1.1-beta-7.jar)添加到你的类路径(classpath)中。这可以通过在IDE中配置构建路径,或者在命令行中指定 `-cp` 参数来完成。一旦...

    分别使用DOM和DOM4j解析XML文件

    以下是如何使用DOM4j解析XML: 1. 引入DOM4j库(如:dom4j-1.6.1.jar)。 2. 创建DocumentFactory实例。 3. 使用DocumentFactory的read()方法读取XML文件,得到Document对象。 4. 使用Document对象提供的方法(如...

    dom4j解析XML文档.ppt

    在解析XML文档后,DOM4J将XML转换为一个对象树,这个树结构与DOM类似但更易于操作。DOM4J的Element类代表XML元素,它提供了丰富的API,例如`elements()`方法,可以轻松获取元素的所有子元素,而不仅仅是子节点,这样...

Global site tag (gtag.js) - Google Analytics