xml转Map,对象,Map转xml,inputs tram 转xml 字符串的工具类方法
众所周知,大家在微信开发工程中,由于微信开发文档中,对于消息的接收发送都是基础xml数据的(太坑了),所以我们需要对XML进行解析转换;
1.我们先引入所需要的依赖 dom4j (解析xml的),xstream(可以将对象,以及复杂对象转换为xml);
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<!-- 转换xml类 -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.5</version>
</dependency>
先给大家介绍一下Java 内置的 jaxp xml 解析器获取的方法,以及Document对象(可以忽视不看)
- /**
- * 获取 jaxp XML 解析器
- * 位于javax 包中,Java 内置支持
- * @throws ParserConfigurationException
- */
- public static DocumentBuilder getJaxpXmlBuilder() throws ParserConfigurationException {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- return builder;
- }
- /**
- * jaxp 获取Document 对象,通过一个文件/流对象
- * @throws ParserConfigurationException
- * @throws IOException
- * @throws SAXException
- */
- public static Document getJaxpDocument(DocumentBuilder builder,Object file) throws Exception {
- DocumentBuilder xmlBuilder;
- if((xmlBuilder=builder)==null) {
- xmlBuilder=getJaxpXmlBuilder();
- }
- if(file instanceof File) {
- return xmlBuilder.parse((File)file);
- }else if(file instanceof InputStream) {
- return xmlBuilder.parse((InputStream)file);
- }else {
- return null;
- }
- }
获取dom4j xml 解析器获取的方法,以及Document对象
- /**
- * dom4j
- * 初始化,获取document 对象通过输入url的方式
- * @param readObject 可以是流,也可以是文件,也可以是URL ,也可以是InputSource
- * @return
- * @throws DocumentException
- */
- public static org.dom4j.Document getDom4jDocument(Object readObject) throws DocumentException {
- SAXReader reader =new SAXReader();
- org.dom4j.Document document ;
- if(readObject instanceof InputStream) {
- document =reader.read((InputStream)readObject);
- }else if(readObject instanceof File) {
- document =reader.read((File)readObject);
- }else if(readObject instanceof URL) {
- document =reader.read((URL)readObject);
- }else if(readObject instanceof InputSource){
- document =reader.read((InputSource)readObject);
- }else {
- //没有匹配的的XML
- document =null;
- }
- return document;
- }
-------------------------------------------重点方法-------------------
2.开始编码 --我会对下面utils类进行解释
先介绍使用XStream 将XML 转换为一个对象,将一个对象转换为XML的方法,并附上实际demo;(需要引入 XStream 包)
(1)XStream 将XML 转换为对象
- /**
- * 将xml 字符串转换为 pojo 对象
- * 确保已经引入xstream 的jar 包
- * 以及类上面使用了@XStreamAlias("你定义的");
- * @param poClass,转化po的Class
- * @param xml
- * @return
- */
- @SuppressWarnings("unchecked")
- public static <T> T xmlToPojo(Class<T> poClass,String xml) {
- XStream xstream =new XStream();
- xstream.processAnnotations(poClass);
- xstream.processAnnotations(getInnerClasses(poClass));
- return (T)xstream.fromXML(xml);
- }
(2). XStream 将一个XML 流转换为对象;
- /**
- * 将inputstream转换为 pojo 对象
- * 确保已经引入xstream 的jar 包
- * 以及类上面使用了@XStreamAlias("你定义的");
- * @param poClass
- * @param xml
- * @return
- */
- @SuppressWarnings("unchecked")
- public static <T> T streamToPojo(Class<T> poClass,InputStream stream) {
- XStream xstream =new XStream();
- xstream.processAnnotations(poClass);
- xstream.processAnnotations(getInnerClasses(poClass));
- return (T)xstream.fromXML(stream);
- }
(3).XStream 将对象转换为xml
- /**
- * 使用 xstream 将一个人pojo 对象转换为xml 字符串
- * 确保已经引入xstream 的jar 包
- * 以及类上面使用了@XStreamAlias("你定义的");
- * @param pojo
- * @return
- */
- public static <T> String pojoToXml(T pojo) {
- Class<?> poClass = pojo.getClass();
- XStream xstream =new XStream();
- xstream.processAnnotations(poClass);
- xstream.processAnnotations(getInnerClasses(poClass));
- return xstream.toXML(pojo);
- }
- getInnerClasses()方法:
- /**
- * 得到一个类的内部类
- * @param clz
- * @return
- */
- public static Class<?>[] getInnerClasses(Class<?> clz) {
- Class<?>[] innerClasses = clz.getClasses();
- if (innerClasses == null) {
- return null;
- }
- List<Class<?>> result = new ArrayList<>();
- result.addAll(Arrays.asList(innerClasses));
- for (Class<?> inner : innerClasses) {
- Class<?>[] innerClz = getInnerClasses(inner);
- if (innerClz == null) {
- continue;
- }
- result.addAll(Arrays.asList(innerClz));
- }
- return result.toArray(new Class<?>[0]);
- }
关于以上方法的demo 如下,让大家加深理解:
- package com.baseknow.testclass;
- import java.util.List;
- import com.thoughtworks.xstream.annotations.XStreamAlias;
- //pojo
- @XStreamAlias("xml")
- public class XmlPojo {
- @XStreamAlias("timespace")
- private String times;
- @XStreamAlias("unionid")
- private String unionid;
- @XStreamAlias("openid")
- private String openid;
- @XStreamAlias("items")
- private List<Msg> msg;
- public XmlPojo(String times,String unionid,String openid){
- this.times =times;
- this.unionid =unionid;
- this.openid =openid;
- }
- @XStreamAlias("item")
- public static class Msg{
- @XStreamAlias("content")
- private String content;
- @XStreamAlias("tocode")
- private String code;
- public Msg(String content,String code){
- this.content=content;
- this.code=code;
- }
- }
- public List<Msg> getMsg() {
- return msg;
- }
- public void setMsg(List<Msg> msg) {
- this.msg = msg;
- }
- public String getTimes() {
- return times;
- }
- public void setTimes(String times) {
- this.times = times;
- }
- public String getUnionid() {
- return unionid;
- }
- public void setUnionid(String unionid) {
- this.unionid = unionid;
- }
- public String getOpenid() {
- return openid;
- }
- public void setOpenid(String openid) {
- this.openid = openid;
- }
- }
main方法:--大家可以进行测试
- public static void main(String[] args) {
- XmlPojo po =new XmlPojo("123","123","123");
- Msg msg =new Msg("ss","ss");
- Msg msg2 =new Msg("ss1","ss1");
- List li =new ArrayList<>();
- li.add(msg2);li.add(msg);
- po.setMsg(li);
- String pojoToXml = XmlParseUtils.pojoToXml(po);
- System.out.println(pojoToXml);
- //转pojo
- XmlPojo poo = XmlParseUtils.xmlToPojo(po.getClass(), pojoToXml);
- System.out.println(poo);
- }
OK,XStream 的常用方法就到这里,对于我来说,用XStream 就够了,很强大,很好扩展,更多需要学习它的api,下面介绍几个也会用到的方法
使用common.io 包下的 IOUtils 可以很方便的将input stream 转换为xml 字符串
- public static String xmlStreamToString (HttpServletRequest request) throws Exception{
- String result =IOUtils.toString(request.getInputStream(), "utf-8");
- return result;
- }
dom4j 将xml数据流转换为map
- public static Map<String,String> xmlTOMap(HttpServletRequest request) throws Exception{
- Map<String,String> map =new HashMap<String,String>();
- SAXReader reader =new SAXReader();
- InputStream ins=null;
- try {
- ins =request.getInputStream();
- } catch (IOException e) {
- e.printStackTrace();
- }
- Document docment =reader.read(ins);//读取流对象
- Element root=docment.getRootElement();
- List<Element> list =root.elements();
- for(Element ele:list) {
- map.put(ele.getName(), ele.getText());
- }
- return map;
- }
使用dom4j将XML转换为Map
- public static Map<String,String> StrXmlTOMap(String strXml) throws Exception{
- Map<String,String> map =new HashMap<String,String>();
- Document docment = DocumentHelper.parseText(strXml);
- Element root=docment.getRootElement();
- List<Element> list =root.elements();
- for(Element ele:list) {
- map.put(ele.getName(), ele.getText());
- }
- return map;
- }
(4)将Map转换为Xml
- /*
- * Map转换成Xml
- */
- public static String MapToXml(Map<String,Object> parameters){
- StringBuffer sb = new StringBuffer();
- sb.append("<xml>");
- Set es = parameters.entrySet();
- Iterator it = es.iterator();
- while(it.hasNext()) {
- Map.Entry entry = (Map.Entry)it.next();
- String k = (String)entry.getKey();
- String v = (String)entry.getValue();
- if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)||"sign".equalsIgnoreCase(k)) {
- sb.append("<"+k+">"+"<![CDATA["+v+"]]></"+k+">");
- }else {
- sb.append("<"+k+">"+v+"</"+k+">");
- }
- }
- sb.append("</xml>");
- return sb.toString();
- }
完整版附上:
- package com.baseknow.utils;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.Properties;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.xpath.XPath;
- import javax.xml.xpath.XPathFactory;
- import org.apache.commons.io.IOUtils;
- import org.dom4j.DocumentException;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.w3c.dom.Document;
- import org.w3c.dom.NamedNodeMap;
- import org.w3c.dom.Node;
- import org.xml.sax.InputSource;
- import org.xml.sax.SAXException;
- import com.thoughtworks.xstream.XStream;
- import com.thoughtworks.xstream.annotations.XStreamAlias;
- /**
- * xml 工具类
- * 包含jaxp 解析器的创建;
- * Xpath 解析器的创建;
- * dom4j 解析器
- * dom4j 解析器创建;
- * 获取XML document 对象;
- * 获取Node attriute
- * xml 的转换
- * @author iscys
- *
- */
- public class XmlParseUtils {
- /**
- * 使用 xstream 将一个人pojo 对象转换为xml 字符串
- * 确保已经引入xstream 的jar 包
- * 以及类上面使用了@XStreamAlias("你定义的");
- * @param pojo
- * @return
- */
- public static <T> String pojoToXml(T pojo) {
- Class<?> poClass = pojo.getClass();
- XStream xstream =new XStream();
- xstream.processAnnotations(poClass);
- xstream.processAnnotations(getInnerClasses(poClass));
- return xstream.toXML(pojo);
- }
- /**
- * 将xml 字符串转换为 pojo 对象
- * 确保已经引入xstream 的jar 包
- * 以及类上面使用了@XStreamAlias("你定义的");
- * @param poClass
- * @param xml
- * @return
- */
- @SuppressWarnings("unchecked")
- public static <T> T xmlToPojo(Class<T> poClass,String xml) {
- XStream xstream =new XStream();
- xstream.processAnnotations(poClass);
- xstream.processAnnotations(getInnerClasses(poClass));
- return (T)xstream.fromXML(xml);
- }
- /**
- * 将inputstream转换为 pojo 对象
- * 确保已经引入xstream 的jar 包
- * 以及类上面使用了@XStreamAlias("你定义的");
- * @param poClass
- * @param xml
- * @return
- */
- @SuppressWarnings("unchecked")
- public static <T> T streamToPojo(Class<T> poClass,InputStream stream) {
- XStream xstream =new XStream();
- xstream.processAnnotations(poClass);
- xstream.processAnnotations(getInnerClasses(poClass));
- return (T)xstream.fromXML(stream);
- }
- /**
- * 使用common 包将流转换为字符串
- * @param stream
- * @return
- * @throws Exception
- */
- public static String xmlStreamToString (InputStream stream) throws Exception{
- String result =IOUtils.toString(stream, "utf-8");
- return result;
- }
- /**
- * 获取 jaxp XML 解析器
- * 位于javax 包中,Java 内置支持
- * @throws ParserConfigurationException
- */
- public static DocumentBuilder getJaxpXmlBuilder() throws ParserConfigurationException {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- return builder;
- }
- /**
- * 获取xpath的实例对象
- */
- public static XPath getXpath() {
- XPathFactory factory = XPathFactory.newInstance();
- XPath xpath = factory.newXPath();
- return xpath;
- }
- /**
- * jaxp 获取Document 对象,通过一个文件/流对象
- * @throws ParserConfigurationException
- * @throws IOException
- * @throws SAXException
- */
- public static Document getJaxpDocument(DocumentBuilder builder,Object file) throws Exception {
- DocumentBuilder xmlBuilder;
- if((xmlBuilder=builder)==null) {
- xmlBuilder=getJaxpXmlBuilder();
- }
- if(file instanceof File) {
- return xmlBuilder.parse((File)file);
- }else if(file instanceof InputStream) {
- return xmlBuilder.parse((InputStream)file);
- }else {
- return null;
- }
- }
- /**
- * dom4j
- * 初始化,获取document 对象通过输入url的方式
- * @param readObject 可以是流,也可以是文件,也可以是URL ,也可以是InputSource
- * @return
- * @throws DocumentException
- */
- public static org.dom4j.Document getDom4jDocument(Object readObject) throws DocumentException {
- SAXReader reader =new SAXReader();
- org.dom4j.Document document ;
- if(readObject instanceof InputStream) {
- document =reader.read((InputStream)readObject);
- }else if(readObject instanceof File) {
- document =reader.read((File)readObject);
- }else if(readObject instanceof URL) {
- document =reader.read((URL)readObject);
- }else if(readObject instanceof InputSource){
- document =reader.read((InputSource)readObject);
- }else {
- //没有匹配的的XML
- document =null;
- }
- return document;
- }
- /**
- * dom4j
- * 获取根节点
- * @param readObject可以是流,也可以是文件,也可以是URL ,也可以是InputSource
- * @return
- * @throws DocumentException
- */
- public static Element getDom4jRootElement(Object readObject) throws DocumentException {
- org.dom4j.Document document = getDom4jDocument(readObject);
- Element root = document.getRootElement();
- return root;
- }
- /**
- * 将node 属性key value 存放到 Properties 中;eg:
- * <test name ="mytest" class="com.XX.XX">
- * 将name ->mytest
- * class -> com.XXX.XXX
- * 存入Properties
- *
- */
- public static Properties parseNodeAttributes(Node n) {
- Properties attributes = new Properties();
- NamedNodeMap attributeNodes = n.getAttributes();
- //判断是否为空
- if (attributeNodes != null) {
- for (int i = 0; i < attributeNodes.getLength(); i++) {
- Node attribute = attributeNodes.item(i);
- attributes.put(attribute.getNodeName(), attribute.getNodeValue());
- }
- }
- return attributes;
- }
- /**
- * 得到一个类的内部类
- * @param clz
- * @return
- */
- public static Class<?>[] getInnerClasses(Class<?> clz) {
- Class<?>[] innerClasses = clz.getClasses();
- if (innerClasses == null) {
- return null;
- }
- List<Class<?>> result = new ArrayList<>();
- result.addAll(Arrays.asList(innerClasses));
- for (Class<?> inner : innerClasses) {
- Class<?>[] innerClz = getInnerClasses(inner);
- if (innerClz == null) {
- continue;
- }
- result.addAll(Arrays.asList(innerClz));
- }
- return result.toArray(new Class<?>[0]);
- }
- }
-----为了怕大家对xstream 注解不了解,大致就是这样的
- @XStreamAlias("xml") //在xstream 注解转化时候,会将类名变为xml ,下面也一样
- public class Pojo {
- @XStreamAlias("namealia")
- private String name;
- @XStreamAlias("agelia")
- private String age;
- @XStreamAlias("lists")
- private List<InnerPojo> list =new ArrayList<>();
xml转Map,对象,Map转xml,inputs tram 转xml 字符串的工具类方法的更多相关文章
- Js基础知识7-Es6新增对象Map和set数据结构
前言 JavaScript中对象的本质是键值对的集合,ES5中的数据结构,主要是用Array和Object,但是键只能是字符串.为了弥补这种缺憾,ES6带来了一种新的数据结构Map. Map也是键值对 ...
- Es6中Map对象和Set对象的介绍及应用
map和set的方法,工作中有使用到,所以学习一下: Map 对象 Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值. var myMap = new Map(); myMa ...
- JavaScript基础对象---Map
一.创建Map对象 Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值 1.构造函数 语法:new Map([iterable])参数: iterable 可 ...
- java 如何遍历Map对象
内容介绍 在java中遍历Map对象的方法. Map对象 Map<String,Object> map = new HashMap<>(); map.put("xia ...
- JS中的Map对象
1,js创建map对象 var map = new Map(); 2.将键值对放入map对象 map.set("key",value) map.set("key1&quo ...
- Map 集合 和 String 字符串相互转换工具类
package com.skynet.rimp.common.utils.util; import java.util.Arrays; import java.util.HashMap; import ...
- Jackson 框架JSON、XML、List、Map直接相互转换
博客分类: json 参考:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html 在其基础上做了稍微调整 详情见附件 jacks ...
- Xml格式数据转map工具类
前言[ 最近在写一个业务,由于调UPS物流的接口返回的是一个xml格式的数据结果,我现在要拿到xml中某个节点的值,而这个xml数据是多节点多层级的,并且这某个节点的值有可能只有一条值,有可能有多条, ...
- JSON,Bean,XML,List,Map
http://blog.csdn.net/superit401/article/details/51728929 JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把J ...
随机推荐
- jquery循环方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- centos磁盘空间重新分配
将/home目录压缩一部分空间到/ ref: https://serverfault.com/a/811124/434124 https://stackoverflow.com/a/19969471/ ...
- 运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)(转)
对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮 ...
- colgroup中col定义表格单元格宽度
colgroup中可以使用col来定义表格单元格宽度,可以使用像素(数字),百分比,我们来具体看看有什么不同. 先看一个最基本的:用像素(数字)表示,因为table有个宽度,这里表示占比 <ht ...
- 创建一个Maven Web应用程序
1 在Eclipes创建maven,首先File new ,在other 中找到Maven,Maven Project,下一步选择WebApp,创建Maven工程名字,完成 2 在新建的Maven工程 ...
- SQL Server 利用Profiler观察执行计划是否重用时SP:Cachemiss,SP:CacheInsert以及SP:CacheHit的含义
本文出处:http://www.cnblogs.com/wy123/p/6913055.html 执行计划的缓存与重用 在通过SQL Profile观察一个SQL语句或者存储过程是否有可用的缓存执行计 ...
- Redis Cluster 添加/删除 完整折腾步骤
Redis还是挺好玩的,今天测试了集群的添加.删除节点.重分配slot等.更深入的理解redis的游戏规则.步骤繁多,但是详细. 环境解释: 我是在一台Centos 6.9上测试的,各个redis节点 ...
- Redux DevTools浏览器插件调试redux
与redux的Devtools模块不同,该工具主要依赖浏览器插件完成.模式也比Devtools简单点. redux-devtools 是一个非常棒的工具,它可以让你实时的监控Redux的状态树的Sto ...
- ServiceWorker.state
[ServiceWorker.state] ServiceWorker.state The state read-only property of the ServiceWorker interfac ...
- mysql 多行合并一行
SELECT `w`.`id` AS `id`, `w`.`phone` AS `phone`, `w`.`belong_id` AS `belong_id`, `w`.`name` AS `name ...