1. package cn.com.do1.wechat.common;
  2. import org.jdom.Attribute;
  3. import org.jdom.Document;
  4. import org.jdom.Element;
  5. import org.jdom.JDOMException;
  6. import org.jdom.input.SAXBuilder;
  7. import java.io.IOException;
  8. import java.io.StringReader;
  9. import java.util.*;
  10. /**
  11. * Created by ao.ouyang on 2015/8/18.
  12. */
  13. public class XmlUtil {
  14.    /**
  15.     * 把xml文件转换为map形式,其中key为有值的节点名称,并以其所有的祖先节点为前缀,用
  16.     * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType
  17.     *
  18.     * @param xmlStr
  19.     *            xml内容
  20.     * @return Map 转换为map返回
  21.     */
  22.    public static Map<String, String> xml2Map(String xmlStr)
  23.            throws JDOMException, IOException {
  24.        Map<String, String> rtnMap = new HashMap<String, String>();
  25.        SAXBuilder builder = new SAXBuilder();
  26.        Document doc = builder.build(new StringReader(xmlStr));
  27.        // 得到根节点
  28.        Element root = doc.getRootElement();
  29.        String rootName = root.getName();
  30.        rtnMap.put("root.name", rootName);
  31.        // 调用递归函数,得到所有最底层元素的名称和值,加入map中
  32.        convert(root, rtnMap, rootName);
  33.        return rtnMap;
  34.    }
  35.    /**
  36.     * 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。
  37.     *
  38.     * @param e
  39.     *            xml节点,包括根节点
  40.     * @param map
  41.     *            目标map
  42.     * @param lastname
  43.     *            从根节点到上一级节点名称连接的字串
  44.     */
  45.    public static void convert(Element e, Map<String, String> map,
  46.                               String lastname) {
  47.        if (e.getAttributes().size() > 0) {
  48.            Iterator it_attr = e.getAttributes().iterator();
  49.            while (it_attr.hasNext()) {
  50.                Attribute attribute = (Attribute) it_attr.next();
  51.                String attrname = attribute.getName();
  52.                String attrvalue = e.getAttributeValue(attrname);
  53.                //map.put( attrname, attrvalue);
  54.                map.put(lastname + "." + attrname, attrvalue); //key 根据根节点 进行生成
  55.            }
  56.        }
  57.        List children = e.getChildren();
  58.        Iterator it = children.iterator();
  59.        while (it.hasNext()) {
  60.            Element child = (Element) it.next();
  61.   /*String name = lastname + "." + child.getName();*/
  62.            String name = child.getName();
  63.            // 如果有子节点,则递归调用
  64.            if (child.getChildren().size() > 0) {
  65.                convert(child, map,  lastname + "." + child.getName());
  66.            } else {
  67.                // 如果没有子节点,则把值加入map
  68.                map.put(name, child.getText());
  69.                // 如果该节点有属性,则把所有的属性值也加入map
  70.                if (child.getAttributes().size() > 0) {
  71.                    Iterator attr = child.getAttributes().iterator();
  72.                    while (attr.hasNext()) {
  73.                        Attribute attribute = (Attribute) attr.next();
  74.                        String attrname = attribute.getName();
  75.                        String attrvalue = child.getAttributeValue(attrname);
  76.                        map.put(lastname + "." + child.getName() + "." + attrname, attrvalue);
  77.                        //map.put( attrname, attrvalue);
  78.                    }
  79.                }
  80.            }
  81.        }
  82.    }
  83.    /**
  84.     * 把xml文件转换为list形式,其中每个元素是一个map,map中的key为有值的节点名称,并以其所有的祖先节点为前缀,用
  85.     * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType
  86.     *
  87.     * @param xmlStr
  88.     *            xml内容
  89.     * @return Map 转换为map返回
  90.     */
  91.    public static List<Map<String, String>> xml2List(String xmlStr)
  92.            throws JDOMException, IOException {
  93.        List<Map<String, String>> rtnList = new ArrayList<Map<String, String>>();
  94.        Map<String, String> rtnMap = new HashMap<String, String>();
  95.        SAXBuilder builder = new SAXBuilder();
  96.        Document doc = builder.build(new StringReader(xmlStr));
  97.        // 得到根节点
  98.        Element root = doc.getRootElement();
  99.        String rootName = root.getName();
  100.        rtnMap.put("root.name", rootName);
  101.        // 调用递归函数,得到所有最底层元素的名称和值,加入map中
  102.        convert2List(root, rtnMap, rootName, rtnList);
  103.        if (rtnList.size() == 0)
  104.            rtnList.add(rtnMap);
  105.        return rtnList;
  106.    }
  107.    /**
  108.     * 递归函数,找出最下层的节点并加入到map中,如果有相同的节点,则加入list中, 由xml2List方法调用。
  109.     *
  110.     * @param e
  111.     *            xml节点,包括根节点
  112.     * @param map
  113.     *            目标map
  114.     * @param lastname
  115.     *            从根节点到上一级节点名称连接的字串
  116.     * @param list
  117.     *            相同节点生成map放入list中
  118.     */
  119.    public static void convert2List(Element e, Map<String, String> map,
  120.                                    String lastname, List<Map<String, String>> list) {
  121.        if (e.getAttributes().size() > 0) {
  122.            Iterator it_attr = e.getAttributes().iterator();
  123.            while (it_attr.hasNext()) {
  124.                Attribute attribute = (Attribute) it_attr.next();
  125.                String attrname = attribute.getName();
  126.                String attrvalue = e.getAttributeValue(attrname);
  127.                map.put(attrname, attrvalue);
  128.            }
  129.        }
  130.        List children = e.getChildren();
  131.        Iterator it = children.iterator();
  132.        while (it.hasNext()) {
  133.            Element child = (Element) it.next();
  134.            String name = lastname + "." + child.getName();
  135.            // 如果有子节点,则递归调用
  136.            if (child.getChildren().size() > 0) {
  137.                convert(child, map, name);
  138.            } else {
  139.                // 如果没有子节点,则把值加入map
  140.                map.put(name, child.getText());
  141.                // 如果该节点有属性,则把所有的属性值也加入map
  142.                if (child.getAttributes().size() > 0) {
  143.                    Iterator attr = child.getAttributes().iterator();
  144.                    while (attr.hasNext()) {
  145.                        Attribute attribute = (Attribute) attr.next();
  146.                        String attrname = attribute.getName();
  147.                        String attrvalue = child.getAttributeValue(attrname);
  148.                        map.put(name + "." + attrname, attrvalue);
  149.                    }
  150.                }
  151.            }
  152.            // 如果有相同节点,则加入list中,不考虑子节点中又有相同节点的情况
  153.            if (e.getChildren(child.getName()).size() > 1) {
  154.                Map<String, String> aMap = new HashMap<String, String>();
  155.                aMap.putAll(map);
  156.                list.add(aMap);
  157.                map = new HashMap<String, String>();
  158.                map.put("root.name", aMap.get("root.name"));
  159.            }
  160.        }
  161.    }
  162. }

基于jdom 的 xmluti的更多相关文章

  1. 具体解释XML解析(一)—解析接口浅析

    在DRP项目中接触到了一个XML解析工具DOM4J,它作为解析工具的据说性能很优秀.可是刚刚接触解析工具不久,而且也没有使用过其它的解析工具.因此对于DOM4J的性能没有直接的感受(没有參照物).只是 ...

  2. XML解析的四种方式

    1.说明 XML是EXtensible Markup Language, 即可扩展标记语言, 是一种通用的数据交换格式, 它的平台无关性.语言无关性.系统无关性, 给数据集成与交互带来了极大的方便. ...

  3. 四种解析和创建方式(DOM,SAX,DOM4J,JDOM)

    一.先导入jar包 DOM基于树形,SAX基于事件,DOM4J和JDOM基于底层API 二.代码如下 1 package com.sxt.test; import java.io.File; impo ...

  4. Javaweb学习笔记——使用Jdom解析xml

    一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...

  5. sax/dom/jdom/dom4j的区别

    sax/dom/jdom/dom4j的区别[转] 博客分类: xml   网上能够查到很多的4种解析方式的区别,我再做一下摘录和总结,顺带给自己做个备份. SAX sax分析器在对xml文档进行分析时 ...

  6. xml解析工具-jdom

    前言:近期接触SSH框架的时候,经常得配置一下xml文件:今天闲来没事就挖挖xml解析的原理供大伙儿分享.本文主要通过一个简单的例子解析一个xml文件.明白其中缘由之后,大家想定义自己的xml也绝非难 ...

  7. 基于ZigBee的家居控制系统的设计与应用

    基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...

  8. DOM、JDOM、DOM4J的区别(转载)

    DOM.JDOM.DOM4J的区别 分类: XML2012-06-11 20:47 5576人阅读 评论(6) 收藏 举报 文档xmlcollectionsjavaapi工作 dom是解析xml的底层 ...

  9. 【Java】XML解析之JDOM

    JDOM介绍 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作.使用jdom需要引入jdom.jar包. XML生成及解析 代码如下: pac ...

随机推荐

  1. 要做的题目-要用到hadoop资源

    关于项目,我出两个练手题目: 一.多机数据处理.有 10 台机器,每台机器上保存着 10 亿个 64-bit 整数(不一定刚好 10 亿个,可能有上下几千万的浮动),一共约 100 亿个整数(其实一共 ...

  2. 实用Linux命令

    lsof -i:6379 查看某个端口的程序有没有起起来. netstat -tnlp 可以查看监听的端口,其中l是listening, p是显示program, n是显示ip而不是name, t看起 ...

  3. Linux下Oracle 10g DataGuard配置(主从同步及切换)

    环境描述:主库: IP: 10.8.3.191 主机名:primaryORACLE_SID=afcORACLE_BASE=/u01/oracleORACLE_HOME=/u01/oracle/10g备 ...

  4. PyDev:warning: Debugger speedups using cython not foun

    在eclipse下调试代码开始时总提示一个警告: warning: Debugger speedups using cython not found. Run '"C:\Python36\p ...

  5. Linux挂载命令mount用法及参数详解

    导读 mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了. 挂接命令(mount) 首先,介绍 ...

  6. [Node.js] 4. Modules

    4.2 Missing Exports Notice the two different files: high_five.js on the left side andapp.js on the r ...

  7. 解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效

    一次编译程序时.出现故障 >------ 已启动生成: 项目: PhotoStore, 配置: Debug Win32 ------ 1>生成启动时间为 2013-01-15 18:10: ...

  8. SCP远程拷贝命令

    利用scp指令可以在linux机器间传递文件,个人使用几次感觉效率还是较高的,比SFTP+本地做媒介要高得多. 1.本地拷贝到远程. 这种方式的命令模式是scp local_file remote_u ...

  9. Keepalived+Nginx实现高可用和双主节点负载均衡

    简介 Nginx可以实现高并发反向代理,lvs集群可以实现负载均衡,但是他们都有一个共同的弊端,就是Nginx,lvs架构中Director是单点故障,有没有一个好的方案解决这个问题呢?答案是有.通过 ...

  10. binlog的几种复制形式

    binlog的几种复制形式 MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式 ...