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. PyDev:warning: Debugger speedups using cython not foun

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

  2. 【Python】Python中的深浅拷贝

    [转]python 复制(拷贝)对象 -- ::| 分类: Python |举报|字号 订阅 下载LOFTER我的照片书 | 需求: 你想复制一个对象.因为在Python中,无论你把对象做为参数传递, ...

  3. 转: SVN使用教程总结(图文丰富,相当详细)

    转自:http://www.cnblogs.com/armyfai/p/3985660.html SVN使用教程总结   SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生 ...

  4. 用sc命令查询系统状态

    用sc命令查询系统状态 sc query 语法 sc query                - Enumerates status for active services & driver ...

  5. Voice Commands (VCD) Cortana 微软小娜示例

    Cortana 样品 您可以创建自定义功能Cortana使用Cortana技能装备或遗留的声音命令(VCD)平台. 在这里,你可以找到相关的样品: Cortana技能装备 目前Cortana技巧是建立 ...

  6. C#应用视频教程2.3 OPENGL虚拟仿真介绍

    本节最重要的一个内容,就是让视野可以平移+旋转+缩放(就像打CS游戏一样以第一人称视角去观察物体,如果可能的话W,S,A,D四个按键控制人物移动,还有鼠标控制视角),本节最重要的一个概念就是设置观察视 ...

  7. .NET破解之爱奇迪(三)

    本教程只能用于学习研究,不可进行任何商业用途.如有使用,请购买正版,尊重他人劳动成果和知识产权! .NET破解之爱奇迪(一) .NET破解之爱奇迪(二) 一打开软件,就看到各种注册和未注册提示信息,就 ...

  8. 零java基础搞定微信Server

    自从打通了微信client到BLE设备端的通道.我的工作就转移到了server端了.微信的BlueDemoServer是以java编写,而本尊仅仅懂得嵌入式,对JavaWeb一窍不通. 本尊贵为IOT ...

  9. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

  10. windows 设置定时锁屏

      设置间隔指定时间电脑自动锁屏 CreateTime--2017年7月3日10:16:14Author:Marydon 参考地址:电脑爱好者杂志 举例:实现每间隔45分钟,电脑自动锁屏 实现思路: ...