基于jdom 的 xmluti
package cn.com.do1.wechat.common;import org.jdom.Attribute;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;import java.io.IOException;import java.io.StringReader;import java.util.*;/*** Created by ao.ouyang on 2015/8/18.*/public class XmlUtil {/*** 把xml文件转换为map形式,其中key为有值的节点名称,并以其所有的祖先节点为前缀,用* "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType** @param xmlStr* xml内容* @return Map 转换为map返回*/public static Map<String, String> xml2Map(String xmlStr)throws JDOMException, IOException {Map<String, String> rtnMap = new HashMap<String, String>();SAXBuilder builder = new SAXBuilder();Document doc = builder.build(new StringReader(xmlStr));// 得到根节点Element root = doc.getRootElement();String rootName = root.getName();rtnMap.put("root.name", rootName);// 调用递归函数,得到所有最底层元素的名称和值,加入map中convert(root, rtnMap, rootName);return rtnMap;}/*** 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。** @param e* xml节点,包括根节点* @param map* 目标map* @param lastname* 从根节点到上一级节点名称连接的字串*/public static void convert(Element e, Map<String, String> map,String lastname) {if (e.getAttributes().size() > 0) {Iterator it_attr = e.getAttributes().iterator();while (it_attr.hasNext()) {Attribute attribute = (Attribute) it_attr.next();String attrname = attribute.getName();String attrvalue = e.getAttributeValue(attrname);//map.put( attrname, attrvalue);map.put(lastname + "." + attrname, attrvalue); //key 根据根节点 进行生成}}List children = e.getChildren();Iterator it = children.iterator();while (it.hasNext()) {Element child = (Element) it.next();/*String name = lastname + "." + child.getName();*/String name = child.getName();// 如果有子节点,则递归调用if (child.getChildren().size() > 0) {convert(child, map, lastname + "." + child.getName());} else {// 如果没有子节点,则把值加入mapmap.put(name, child.getText());// 如果该节点有属性,则把所有的属性值也加入mapif (child.getAttributes().size() > 0) {Iterator attr = child.getAttributes().iterator();while (attr.hasNext()) {Attribute attribute = (Attribute) attr.next();String attrname = attribute.getName();String attrvalue = child.getAttributeValue(attrname);map.put(lastname + "." + child.getName() + "." + attrname, attrvalue);//map.put( attrname, attrvalue);}}}}}/*** 把xml文件转换为list形式,其中每个元素是一个map,map中的key为有值的节点名称,并以其所有的祖先节点为前缀,用* "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType** @param xmlStr* xml内容* @return Map 转换为map返回*/public static List<Map<String, String>> xml2List(String xmlStr)throws JDOMException, IOException {List<Map<String, String>> rtnList = new ArrayList<Map<String, String>>();Map<String, String> rtnMap = new HashMap<String, String>();SAXBuilder builder = new SAXBuilder();Document doc = builder.build(new StringReader(xmlStr));// 得到根节点Element root = doc.getRootElement();String rootName = root.getName();rtnMap.put("root.name", rootName);// 调用递归函数,得到所有最底层元素的名称和值,加入map中convert2List(root, rtnMap, rootName, rtnList);if (rtnList.size() == 0)rtnList.add(rtnMap);return rtnList;}/*** 递归函数,找出最下层的节点并加入到map中,如果有相同的节点,则加入list中, 由xml2List方法调用。** @param e* xml节点,包括根节点* @param map* 目标map* @param lastname* 从根节点到上一级节点名称连接的字串* @param list* 相同节点生成map放入list中*/public static void convert2List(Element e, Map<String, String> map,String lastname, List<Map<String, String>> list) {if (e.getAttributes().size() > 0) {Iterator it_attr = e.getAttributes().iterator();while (it_attr.hasNext()) {Attribute attribute = (Attribute) it_attr.next();String attrname = attribute.getName();String attrvalue = e.getAttributeValue(attrname);map.put(attrname, attrvalue);}}List children = e.getChildren();Iterator it = children.iterator();while (it.hasNext()) {Element child = (Element) it.next();String name = lastname + "." + child.getName();// 如果有子节点,则递归调用if (child.getChildren().size() > 0) {convert(child, map, name);} else {// 如果没有子节点,则把值加入mapmap.put(name, child.getText());// 如果该节点有属性,则把所有的属性值也加入mapif (child.getAttributes().size() > 0) {Iterator attr = child.getAttributes().iterator();while (attr.hasNext()) {Attribute attribute = (Attribute) attr.next();String attrname = attribute.getName();String attrvalue = child.getAttributeValue(attrname);map.put(name + "." + attrname, attrvalue);}}}// 如果有相同节点,则加入list中,不考虑子节点中又有相同节点的情况if (e.getChildren(child.getName()).size() > 1) {Map<String, String> aMap = new HashMap<String, String>();aMap.putAll(map);list.add(aMap);map = new HashMap<String, String>();map.put("root.name", aMap.get("root.name"));}}}}
基于jdom 的 xmluti的更多相关文章
- 具体解释XML解析(一)—解析接口浅析
在DRP项目中接触到了一个XML解析工具DOM4J,它作为解析工具的据说性能很优秀.可是刚刚接触解析工具不久,而且也没有使用过其它的解析工具.因此对于DOM4J的性能没有直接的感受(没有參照物).只是 ...
- XML解析的四种方式
1.说明 XML是EXtensible Markup Language, 即可扩展标记语言, 是一种通用的数据交换格式, 它的平台无关性.语言无关性.系统无关性, 给数据集成与交互带来了极大的方便. ...
- 四种解析和创建方式(DOM,SAX,DOM4J,JDOM)
一.先导入jar包 DOM基于树形,SAX基于事件,DOM4J和JDOM基于底层API 二.代码如下 1 package com.sxt.test; import java.io.File; impo ...
- Javaweb学习笔记——使用Jdom解析xml
一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...
- sax/dom/jdom/dom4j的区别
sax/dom/jdom/dom4j的区别[转] 博客分类: xml 网上能够查到很多的4种解析方式的区别,我再做一下摘录和总结,顺带给自己做个备份. SAX sax分析器在对xml文档进行分析时 ...
- xml解析工具-jdom
前言:近期接触SSH框架的时候,经常得配置一下xml文件:今天闲来没事就挖挖xml解析的原理供大伙儿分享.本文主要通过一个简单的例子解析一个xml文件.明白其中缘由之后,大家想定义自己的xml也绝非难 ...
- 基于ZigBee的家居控制系统的设计与应用
基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘 要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...
- DOM、JDOM、DOM4J的区别(转载)
DOM.JDOM.DOM4J的区别 分类: XML2012-06-11 20:47 5576人阅读 评论(6) 收藏 举报 文档xmlcollectionsjavaapi工作 dom是解析xml的底层 ...
- 【Java】XML解析之JDOM
JDOM介绍 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作.使用jdom需要引入jdom.jar包. XML生成及解析 代码如下: pac ...
随机推荐
- [Todo] Redis里面队列的两种模式,以及抢红包在Redis中的实现
两种队列模式: 一种是利用list的lpush/rpop等 另一种是redis自带的发布者/订阅者模式 http://www.cnblogs.com/alazalazalaz/p/5512258.ht ...
- Linux Centos7安装chrome浏览器
参考:https://blog.csdn.net/u010472499/article/details/72327963 1. 配置yum源 在目录 /etc/yum.repos.d/ 下新建文件 g ...
- 引导工具GRUB详解
导读 引导程序是驻留在硬盘第一个扇区(MPR.主引导记录)的程序.GRUB是一个功能强大的多系统引导程序,专门处理Linux与其它操作系统共存的问题.下面就由我介绍一下grub.conf文件里的具体内 ...
- org.springframework.beans.NotWritablePropertyException
刚碰到了这个异常,最后发现是bean配置xml文件中的属性名多了一个空格,这就是xml配置spring的弊端啊. 感谢百度,迅速定位了问题. https://yq.aliyun.com/article ...
- HTTP 头缓存Last-Modified,ETag,Expires
http://www.jdon.com/40381 Last-Modified和Expires针对浏览器,而ETag则与客户端无关,所以可适合REST架构中.两者都应用在浏览器端的区别是:Expire ...
- webpack 编译模板文件
1.项目结构 安装loader: npm i html-loader --save-dev npm i ejs-loader --save-dev 2.模板文件layer.tpl <div cl ...
- oracle 对系统日期sysdate进行格式化:to_date(sysdate,'yyyy-MM-dd')
oracle 对系统日期sysdate进行格式化:to_date(sysdate,'yyyy-MM-dd') CreateTime--2018年5月17日10:11:34 Author:Maryd ...
- Eclipse/Myeclipse中查看和调试JDK源代码的方法
看过这篇文章后,实践写的 http://blog.csdn.net/qq_27857857/article/details/71250401 一共做了以下几部: 第一步: 第二步: 一直next,到第 ...
- Spring @Autowired、@Resource、@Required、@Component、@Repository、@Service、@Controller注解的用法和作用
Spring @Autowired,@Resource,@Required注解的用法和作用 Spring中 @Autowired标签与 @Resource标签 的区别 Spring注解@Compone ...
- QQ的未来在那里
http://blog.sina.com.cn/s/blog_53bcb13e0100030g.html 早期的QQ非常清爽,没有广告,友好的界面,飞快的连接速度,为中国人量身订做的体贴功能,非常吸引 ...