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. java 中函数的参数传递详细介绍

    java中函数的参数传递 总结: 1.将对象(对象的引用)作为参数传递时传递的是引用(相当于指针).也就是说函数内对参数所做的修改会影响原来的对象.  2.当将基本类型或基本类型的包装集作为参数传递时 ...

  2. C++ 函数参数中“ *&代表什么? ”

    typedef struct BitNode  {      char value;      BitNode *lchild,*rchild;    }BitNode,*BiTree; void C ...

  3. 使用Proxmark3进行MIFARE Classic卡的安全测试

    使用Proxmark3进行MIFARE Classic卡的安全测试   Proxmark3的MIFARE安全测试是很多朋友都非常重视的一部分,所以我们特地以这个部分进行介绍,告诉大家如何当你完成前期操 ...

  4. Echarts使用dataset数据集管理数据

    1.可以看官网api的入门例子 使用常见的对象数组的格式 option = { legend: {}, tooltip: {}, dataset: { // 这里指定了维度名的顺序,从而可以利用默认的 ...

  5. MapReduce API 基本概念

    在正式分析新旧 API 之前, 先要介绍几个基本概念. 这些概念贯穿于所有 API 之中,因此, 有必要单独讲解. 1.序列化 序列化是指将结构化对象转为字节流以便于通过网络进行传输或写入持久存储的过 ...

  6. Java保存简单偏好的类

    该类利用Preferences保存文本,数字等简单数据,在Windows平台下,它就保存到了系统注册表中,而Linux中它存在于用户目录下的一个隐藏文件中. public class Pref{   ...

  7. 通过Intel XDK编写跨平台app(二)

    通过Intel XDK编写跨平台app(一) 通过Intel XDK编写跨平台app(二) 在这个系列的上一篇文章中,我们大致了解了Interl XDK的概况.在这一部分中,我们会详细地介绍如何通过这 ...

  8. “建议127:Lock与synchronized是不一样的问题”实际验证

    近期又一次翻看    "编写高质量代码:改善Java程序的151个建议"  一书的时候看到"建议127"的文章中作者提供的測试用例存在一些值得商榷的地方. 在使 ...

  9. iOS核心动画 - CALayer

    大家知道,在iOS中所有的视图都继承自UIView. UIView处理所有的触摸事件和画图. 事实上,UIView所有的渲染和动画是托管给另一个类来负责的,它就是CALayer. 但是,需要记住的是, ...

  10. SpringMVC请求参数和响应结果全局加密和解密

    前提 前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景.为了模拟真实的交互场景,先定制一下整个交互流程.第三方传输(包括请求和响应)数据报文包括三个部分: 1.t ...