文档章节

XML工具类封装

 石头茨
发布于 2017/02/11 23:58
字数 803
阅读 33
收藏 2
点赞 0
评论 0

xml转json,基于json-lib-2.4-jdk15.jar; xml转map,基于jdom2-2.0.6.jar

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import net.sf.json.JSON;
import net.sf.json.JSONSerializer;
import net.sf.json.xml.XMLSerializer;

public class XmlUtil {

	/**
	 * 属性标识
	 */
	public static final String attributeMark = "@";

	/**
	 * 将xml字符串<STRONG>转换</STRONG>为JSON字符串
	 * 
	 * @param xmlString
	 *            xml字符串
	 * @return JSON<STRONG>对象</STRONG>
	 */
	public static String xml2json(String xmlString) {
		XMLSerializer xmlSerializer = new XMLSerializer();

		JSON json = xmlSerializer.read(xmlString);
		return json.toString();
	}

	/**
	 * 将xmlDocument<STRONG>转换</STRONG>为JSON<STRONG>对象</STRONG>
	 * 
	 * @param xmlDocument
	 *            XML Document
	 * @return JSON<STRONG>对象</STRONG>
	 */
	public static String xml2json(Document xmlDocument) {
		return xml2json(xmlDocument.toString());
	}

	/**
	 * JSON(数组)字符串<STRONG>转换</STRONG>成XML字符串。<br/>
	 * json字符串,属性字段转xml时,需要添加@标识。<br/>
	 * 
	 * <pre>
	 * 如:
	 *	"Application": {
	 *		"@decisionNum": "01",
	 *		"@applicationID": "adfsdf",
	 *		"MessageList": {
	 *			"StatusCode": "1",
	 *			"StatusDescription": "Successful"
	 *		}
	 *	}
	 * </pre>
	 * 
	 * @param jsonString
	 * @return xml 数据
	 */
	public static String json2xml(String jsonString) {
		XMLSerializer xmlSerializer = new XMLSerializer();
		return xmlSerializer.write(JSONSerializer.toJSON(jsonString));
		// return
		// xmlSerializer.write(JSONArray.fromObject(jsonString));//这种方式只支持JSON数组
	}

	/**
	 * 取得xml文件的根节点名称,即消息名称。
	 * 
	 * @param xmlStr
	 *            xml内容
	 * @return String 返回名称
	 */
	public static String getRootName(String xmlStr) throws Exception {
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(new StringReader(xmlStr));
		Element root = doc.getRootElement();
		return root.getName();
	}

	private static void getAttributeValue(Element e, Map<String, Object> map) {
		if (e.getAttributes().size() > 0) {
			Iterator<Attribute> 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);
			}
		}
	}

	/**
	 * 把xml文件转换为map形式,其中key为有值的节点名称
	 * 
	 * @param xmlStr
	 *            xml内容
	 * @return Map 转换为map返回
	 */
	public static Map<String, Object> xml2Map(String xmlStr) throws JDOMException, IOException {
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(new StringReader(xmlStr));
		Map<String, Object> rtnMap = new HashMap<String, Object>();
		if (doc == null) {
			return rtnMap;
		}

		// 得到根节点
		Element rootElement = doc.getRootElement();

		Map<String, Object> bodyMap = new HashMap<String, Object>();
		rtnMap.put(rootElement.getName(), bodyMap);

		element2map(rootElement, bodyMap);
		return rtnMap;
	}

	/**
	 * 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。
	 * 
	 * @param element
	 *            xml节点,包括根节点
	 * @param map
	 *            目标map
	 */
	public static void element2map(Element element, Map<String, Object> map) {
		if (null == element) {
			return;
		}
		getAttributeValue(element, map);

		String name = element.getName();
		List<Element> children = element.getChildren();
		if (!"".equals(element.getTextTrim())) {
			map.put(name, element.getText());
		} else if (children != null && children.size() > 0) {
			for (Element elmtSub : children) {
				Map<String, Object> mapSub = new HashMap<String, Object>();
				String childName = elmtSub.getName();
				element2map(elmtSub, mapSub);

				Object first = map.get(childName);
				if (null == first) {
					map.put(childName, mapSub);
				} else {
					if (first instanceof List<?>) {
						((List) first).add(mapSub);
					} else {
						List<Object> listSub = new ArrayList<Object>();
						listSub.add(first);
						listSub.add(mapSub);
						map.put(childName, listSub);
					}
				}
			}

		}
	}

	/**
	 * 格式化xml
	 * 
	 * @param xmlStr
	 * @param encoding
	 * 
	 * @return String
	 * @throws Exception
	 */
	public static String formatXml(String xmlStr) throws Exception {
		return formatXml(xmlStr, "utf-8");
	}

	/**
	 * 格式化xml
	 * 
	 * @param xmlStr
	 * @param encoding
	 * 
	 * @return String
	 * @throws Exception
	 */
	public static String formatXml(String xmlStr, String encoding) throws Exception {
		SAXBuilder sb = new SAXBuilder();
		Reader reader = new StringReader(xmlStr);

		Document doc = null;
		try {
			doc = sb.build(reader);
		} catch (Exception e) {
			throw e;
		}

		Format prettyFormat = Format.getPrettyFormat();
		prettyFormat.setEncoding(encoding);
		XMLOutputter outputter = new XMLOutputter(prettyFormat);
		String result = "";
		if (null != doc) {
			result = outputter.outputString(doc);
		}

		return result;
	}

	/**
	 * 
	 * map2Xml <br/>
	 * map对象,字段生成为xml属性时,key需要添加@标识。<br/>
	 * 列如map实例对象字符串:{Application={@applicationID=adfsdf, AppliInfo={@age=23,name=yame}}}
	 * <br/>
	 * 
	 * @param map
	 * @return
	 * @throws Exception
	 */
	public static String map2Xml(Map map) throws Exception {
		StringBuffer sb = new StringBuffer();
		sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		mapToXmlHandle(map, sb);
		try {
			return sb.toString();
		} catch (Exception e) {
			throw e;
		}
	}

	private static void mapToXmlHandle(Map map, StringBuffer sb) {
		Set set = map.keySet();
		for (Iterator it = set.iterator(); it.hasNext();) {
			String key = (String) it.next();
			Object value = map.get(key);
			if (null == value)
				value = "";
			if (value instanceof List) {
				List list = (List) value;

				for (int i = 0; i < list.size(); i++) {
					sb.append("<");
					sb.append(key);
					sb.append(">");
					Map hm = (Map) list.get(i);
					mapToXmlHandle(hm, sb);
					sb.append("</");
					sb.append(key);
					sb.append(">");
				}

			} else {
				if (value instanceof Map) {
					sb.append("<");
					sb.append(key);
					sb.append(">");
					mapToXmlHandle((HashMap) value, sb);
					sb.append("</");
					sb.append(key);
					sb.append(">");
				} else {
					if (key.startsWith(attributeMark)) {
						String tempAtt = " " + key.replaceAll(attributeMark, "") + "=\"" + value + "\"";
						sb.insert(sb.length() - 1, tempAtt);
					} else {
						sb.append("<" + key + ">" + value + "</" + key + ">");
					}
				}

			}

		}
	}

}


© 著作权归作者所有

共有 人打赏支持
粉丝 14
博文 6
码字总数 2277
作品 0
武汉
接口自动化测试框架搭建

一、原理及特点 参数放在XML文件中进行管理 用httpClient简单封装一个httpUtils工具类 测试用例管理使用了testNg管理,使用了TestNG参数化测试,通过xml文件来执行case。 测试报告这里用到第...

红焖鲤鱼
2016/08/26
4.8K
9
微信公众帐号开发教程第4篇-消息及消息处理工具的封装

工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用。这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平...

bliver
2013/11/29
0
2
Ajava攻城师/AjavaAndroidLib

将zftlive工程部分共通源代码抽取为类库 已集成第三方开源组件: 网络请求库android-async-http 图片异步加载库universal-image-loader Sqlite数据库操作ormlite-android 社会化分享ShareSD...

Ajava攻城师
2015/06/26
0
0
Json那点事儿

1.JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,JSON以key-value的形式提供了很好的读写,在web开发中之前用过xml来进行数据的交互和传输, 但xml的数据结构比较复...

陈小扁
2016/04/10
108
1
Java 工具集-Hutool

Hutool是一个Java工具集,针对我们项目中util包进行开刀,抽象大量的工具方法,旨在减少项目中工具类的数量,将我们的编码工作专注在业务上。Hutool 对文件、流、加密解密、转码、正则、线程...

路小磊
2014/04/17
21.2K
31
微信接口封装--wechatbasic

微信公众平台基本接口和几个高级接口封装,是对2013年微信公众平台开放后基础接口和区分为服务好和订阅号后相应增加的接口封装 com.sedion.basic.util内为基本信息工具: 1.SendBasicService...

mynawang
2015/07/17
2.4K
0
Android 应用开发框架|核心库--Cangol-appcore

这是一个Android 应用核心库,将应用的常用功能模块化,以便提高开发效率。 详细文档 引用方式 Maven <dependency> <groupId>mobi.cangol.mobile</groupId> <artifactId>appcore</artifactId......

Cangol
2016/06/08
447
0
mynawang/wechatbasic

com.sedion.basic.util内为基本信息工具: 1.SendBasicService为自动回复6大类消息的封装 com.sedion.menu.util内为菜单管理工具: 1.MenuUtil为增删差自定义菜单的封装 2.MenuManager为自定...

mynawang
2015/07/17
0
0
Android基于DataBinding的一个基础框架

开篇废话 因公司需求,开发了一个基于DataBinding的基础框架,以后公司可能写项目都要按这个框架来写,规范一些,有利于互相读代码。先附上github链接吧——CFramework。 如果不知道什么是D...

一个有故事的程序员
2017/11/01
0
0
Spring集成redis(Spring Data Redis)

转载地址:http://blog.csdn.net/zhu_tianwei/article/details/44923001 Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(...

Mr_zebra
06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

17.TCP:传输控制协议

介绍 TCP和UDP使用同一网络层(IP),但TCP提供了面向连接、可靠的传输层服务 TCP传输给IP层的信息单位称为报文段或段 TCP通过如下方式保证可靠性: 应用数据被分割成TCP认为最合适发送的数据...

loda0128
6分钟前
0
0
重装Oracle时出现environment variable "PATH"错误的解决办法

在win7 64位下重新安装oracle 11g,一直报environment variable "PATH"的错误,按说明将path里多余的路径删除,但没办法解决。选择忽略错误继续安装,装一半会报CRC错误,还是安装失败。最好...

良言
11分钟前
0
0
TensorFlow 全连接的mnist

全连接的mnist import tensorflow as tf# 导入 MINST 数据集from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("MNIST_data/", one_ho......

阿豪boy
12分钟前
0
0
JAVA 三种WebService 规范

JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。 1. Jaxws(掌握) JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务...

onedotdot
31分钟前
0
0
将博客搬至CSDN

将博客搬至CSDN

xpbob
32分钟前
1
0
Aidl进程间通信详细介绍

目录介绍 1.问题答疑 2.Aidl相关属性介绍 2.1 AIDL所支持的数据类型 2.2 服务端和客户端 2.3 AIDL的基本概念 3.实际开发中案例操作 3.1 aidl通信业务需求 3.2 操作步骤伪代码 3.3 服务端操作...

潇湘剑雨
49分钟前
0
0
python爬虫日志(3)下载图片

import urlliburl='https://xxx.jpg'#图片地址res=urllib.request.urlopen(url)#此函数用于对url的访问data=res.read() #字节流with open(r'D:\1.jpg',"wb") as code: c...

茫羽行
今天
0
0
vue中$emit的用法

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运...

JamesView
今天
0
0
bash审计系统搭建

step1:使用saltstack工具bash部署>>>>>> # salt -N clienta state.sls audit step2:安装elasticsearch>>>>>> 注意: 1.不能以root用户进行启动,需要创建用户,并对解压的elasticsearch目录赋......

硅谷课堂
今天
0
0
Linux sar性能分析

Linux使用sar进行性能分析 sar简介 sar命令常用格式 sar常用性能数据分析 整体CPU使用统计-u 各个CPU使用统计-P 内存使用情况统计-r 整体IO情况-b 各个IO设备情况-d 网络统计-n sar日志保存-...

易野
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部