`
sha1064616837
  • 浏览: 39360 次
  • 性别: 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文档.doc

    无论是读取XML文件,解析XML字符串,还是创建、修改和遍历XML结构,DOM4J都提供了简洁的接口,极大地简化了开发者的工作。在实际的开发中,掌握DOM4J的使用,能够帮助你更有效地处理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数据与业务对象关联时,反射机制显得尤为重要。

    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

    Dom4j 遍历解析 XML Dom4j 是一个基于 Java 的 XML 解析库,提供了广泛的 XML 解析功能。Dom4j 遍历解析 XML 是指使用 Dom4j 库来解析和遍历 XML 文档,提取其中的元素、属性和值。 在 Dom4j 中,遍历 XML 文档...

    利用Dom4j生成XML和解析XML

    "Dom4j 生成 XML 和解析 XML" Dom4j 是一个 Java 库,用于处理 XML 文档。它提供了生成和解析 XML 文档的功能。在本文中,我们将学习如何使用 Dom4j 生成 XML 文档和解析 XML 文档。 生成 XML 文档 使用 Dom4j ...

    用dom4j解析xml文件

    本篇文章将深入探讨如何使用DOM4J来解析XML文件,以及通过示例代码来展示其基本操作。 首先,我们需要理解DOM4J的工作原理。DOM4J采用的是DOM(Document Object Model)模型,它将整个XML文档加载到内存中形成一棵...

    dom4j解析xml,连接oracle数据库

    在本实例中,我们将深入探讨如何使用DOM4J解析XML,并利用这些数据连接Oracle数据库进行数据操作。 首先,让我们了解DOM4J的基本用法。DOM4J的主要类包括`Document`、`Element`、`Attribute`和`Namespace`。`...

    Java使用sax、dom、dom4j解析xml文档

    以下是一个DOM4J解析XML的简单示例: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; public class Dom4jExample { public static void main(String[] args) {...

    Dom4j解析XML+使用简介

    **Dom4j解析XML+使用简介** Dom4j是一个非常流行的Java库,专门用于处理XML文档,它提供了灵活且高效的方式来解析、创建和操作XML内容。这个库在XML处理领域中备受推崇,因为它简单易用,同时又具有高度的灵活性和...

Global site tag (gtag.js) - Google Analytics