`
sha1064616837
  • 浏览: 38881 次
  • 性别: 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解析XML帮助

    SOAP 即Simple Object Access Protocol(简单对象访问协议)。不会还没听说过吧, 地球上的人都知道啊。SOAP 正成为Web 编程世界最炙手可热的概念,而且还是席 卷最新一代Web 开发的Web 服务热潮的组成部分。如果你...

    dom4j解析xml

    使用dom4j解析xml,包括节点的操作、属性的操作、document对象写入新文件等操作。

    xmlParse:使用 dom4j 将 XML 文档解析为 Java 对象

    使用 dom4j 将 XML 文档解析为我自己的格式 格式: 私人字符串名称; 私有字符串值; 私人列表 childList; private Map<String> propMap = new HashMap(); 意义 将 XML 文档对象转换成这个格式对象(XmlElement...

    dom4j创建及解析xml

    使用 dom4j 解析 XML;dom4j 是一种解析 XML 文档的开放源代码 XML 框架。本文介绍如何使用包含在 dom4j 中的解析器创建并修改 XML 文档。

    java_Dom4j解析XML详解

    DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。  DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用。  Dom:把整个...

    dom4j-1.6.1 + w3cschool.CHM离线帮助文档

    dom4j 目录的介绍: 1)docs 是文档目录 2)如何查 Dom4j 的文档 3)Dom4j 快速入门 2)lib 目录 ...第三方的解析: jdom 在 dom 基础上进行了封装、 dom4j 又对 jdom 进行了封装。 pull 主要用在 And

    dom4j-1.6.1.zip

    Dom4j解析xml的jar包,Dom4J常用的对象:SAXReader:读取xml文件到Document树结构文件对象。Document:是一个xml文档对象树,类比Html文档对象。Element:元素节点。通过Document对象可以查找单个元素

    dom4j使用方法

    dom4j的各种用法 读取XML文件,获得document对象.解析XML形式的文本,得到document对象.

    XML_dom_sax_dom4j:XML解析技术之dom、Sax、dom4j以及XML Schema技术约束

    XML_StuGradeExam_domXML解析技术之dom、Sax、dom4j技术演习以及Schema XML文档约束##XML解析开发包Jaxp(sun)Jdomdom4j####ExamExam是一个使用Xml持久化保存数据的xml数据库,该项目是演练dom解析XML技术很好的一个...

    dom4j、XStream的jar包

    dom4j用于解析xml 文档,而XStream则是将Java对象转成xml文件。使用这两个工具就很好的解决了xml文件的解析与Java对象转成xml的麻烦了!

    xml解析例子Dom,DOM4J,SAX Stack mystack = new Stack();

    简单的xml解析,生成例子 public void characters(char[] c, int start, int end) throws SAXException { String s = mystack.peek().toString(); System.out.println("栈顶对象为"+s+"\t"+"当前栈区大小为"+...

    dom4j

    } <br> /** * 修改XML文件中内容,并另存为一个新文件 * 重点掌握dom4j中如何添加节点,修改节点,删除节点 * @param filename 修改对象文件 * @param newfilename 修改后另存为该文件 * @...

    dom4j-2.0.2.rar 解析jar下载

    基于Java集合框架的XML文档对象模型 Java 5+ 泛型支持

    Spring-IOC手动模拟实现-利用dom4解析xml文件

    通过dom4j解析配置文件,得到list集合(存放Bean标签的id和class属性) * 3.通过反射实例化得到对应的实例化对象,放置在map中(map是键值对,可根据id获取值)(遍历list获取对应的class属性,利用class。formName...

    Java中读取XML 文件的知识点

    xml 解析 dom 文档对象模型(随机访问) 效率慢 受大小限制(10M) SAX 事件驱动(效率高,不受大小限制) 一、Dom4j下载及使用Dom4j读写XML简介: 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站...

    XML解析教程

    java解析xml四种方式 DOM (Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的标准接口, DOM采用建立树形结构的方式访问XML文档. SAX(Simple API for XML) 不是某个官方标准,但它是 XML 社区事实...

    dom4j.jar.jar

    获得文档解析器工厂对象 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); // 2. 获得文档解析器对象 DocumentBuilder documentBuilder = documentBuilderFactory....

    Dom4j使用入门

    解析XML文件使用的核心类 read() --> XML文件Document对象 Document document = new SAXReader().read(new File("./xml/User.xml")); Document对象中可以使用方法 Element getRootElement(); ...

    xml的JAVA解析与格式定义

    解析器的介绍 文档对象模型(DOM)解析实例 SAX解析实例 DOM4J解析实例 JDOM解析实例 JAVA操纵XML 实例讲解

Global site tag (gtag.js) - Google Analytics