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. 给文件夹添加Everyone用户

    DOC命令 C# code 1. cacls C:dming /g everyone:f /e /t 这样可以添加 2. cacls C:Program Files客友软件 /g everyone:f ...

  2. thinkphp问题

    这几天组里有个php系统报安全漏洞,负责的厂商跑了,没办法,被组长丢过来改漏洞,记录一下部分内容. 配置php的环境  参考https://blog.csdn.net/u011415782/artic ...

  3. PHP超过三十秒怎么办Maximum execution time of 30 seconds exceeded

    1 如图所示, Maximum execution time of 30 seconds exceeded 2 在php.ini文件中查找"max_execution_time"把 ...

  4. nginx的 CPU參数worker_processes和worker_cpu_affinity使用说明

    Nginx默认没有开启利用多核CPU,我们能够通过添加worker_cpu_affinity配置參数来充分利用多核CPU.CPU是任务处理,计算最关键的资源,CPU核越多.性能就越好. worker_ ...

  5. 《Go并发编程实战》第2版 紧跟Go的1.8版本号

    文章作者:郝林(<Go并发编程实战 (第2版)>作者) 最终来了! 经过出版社的各位编辑.校对.排版伙伴与我的N轮PK和共同努力,<Go并发编程实战>第2版的全部内容最终全然确 ...

  6. vue - 添加sass(less)处理

    1. 添加less.sass处理 1.1如果是sass,首先在当前目录安装处理插件(sass): npm i -D node-sass sass-loader 1.2如果是less,首先在当前目录安装 ...

  7. Android日常开发总结

    全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效. 数据库表段字段常量和SQL逻辑分离,更清晰,建议使用 ...

  8. 网站banner图片制作(简易版)

    1.新建图层 根据baner需求,新建图层尺寸: 2.将图片拖进图层 按住shift对图片进行等比例缩放,将等比例缩放后的图片平铺到图层上. 3.添加文字 设置字体以及字体颜色 4.添加描边 选择文字 ...

  9. DBA 需要知道N种对数据库性能的监控SQL语句

    --DBA 需要知道N种对数据库性能的监控SQL语句 -- IO问题的SQL内部分析 下面的DMV查询可以来检查当前所有的等待累积值. Select wait_type, waiting_tasks_ ...

  10. phpredis中文手册——《redis中文手册》 php版(转)

    redis中文手册:http://readthedocs.org/docs/redis/en/latest/ 本文是参考<redis中文手册>,将示例代码用php来实现,注意php-red ...