众所周知,大家在微信开发工程中,由于微信开发文档中,对于消息的接收发送都是基础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 字符串的工具类方法的更多相关文章

  1. Js基础知识7-Es6新增对象Map和set数据结构

    前言 JavaScript中对象的本质是键值对的集合,ES5中的数据结构,主要是用Array和Object,但是键只能是字符串.为了弥补这种缺憾,ES6带来了一种新的数据结构Map. Map也是键值对 ...

  2. Es6中Map对象和Set对象的介绍及应用

    map和set的方法,工作中有使用到,所以学习一下: Map 对象 Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值. var myMap = new Map(); myMa ...

  3. JavaScript基础对象---Map

    一.创建Map对象 Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值 1.构造函数 语法:new Map([iterable])参数:         iterable  可 ...

  4. java 如何遍历Map对象

    内容介绍 在java中遍历Map对象的方法. Map对象 Map<String,Object> map = new HashMap<>(); map.put("xia ...

  5. JS中的Map对象

    1,js创建map对象 var map = new Map(); 2.将键值对放入map对象 map.set("key",value) map.set("key1&quo ...

  6. Map 集合 和 String 字符串相互转换工具类

    package com.skynet.rimp.common.utils.util; import java.util.Arrays; import java.util.HashMap; import ...

  7. Jackson 框架JSON、XML、List、Map直接相互转换

    博客分类: json   参考:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html 在其基础上做了稍微调整 详情见附件 jacks ...

  8. Xml格式数据转map工具类

    前言[ 最近在写一个业务,由于调UPS物流的接口返回的是一个xml格式的数据结果,我现在要拿到xml中某个节点的值,而这个xml数据是多节点多层级的,并且这某个节点的值有可能只有一条值,有可能有多条, ...

  9. JSON,Bean,XML,List,Map

    http://blog.csdn.net/superit401/article/details/51728929 JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把J ...

随机推荐

  1. js实现上传前删除指定图片

    "上传之前"移除选错图片代码: 此处效果为:点击需要删除的图片,确认删除就可以了.

  2. Delphi 中的颜色常量及效果图

    颜色名称   颜色效果   Hex HTML clBlack   $000000 #000000 clMaroon   $000080 #800000 clGreen   $008000 #00800 ...

  3. 关于HashMap多线程下环形链表的总结

    目录 1. 概述 2. 敲黑板的点 3. 为什么会出现循环链表的情况呢?(jdk1.7) 4. jdk1.8中改进了resize方法 5. HashMap的线程安全问题 6. 总结 1. 概述 本文主 ...

  4. Ubuntu网卡配置

    目录 1.查看所有可用网卡 2.编辑配置文件 3.添加可用网卡信息 4.重启网络服务 5.查看网卡信息 1.查看所有可用网卡 $ ifconfig -a # -a display all interf ...

  5. python实现根据指定字符截取对应的行的内容

    工作中遇到的,在一个.c文件中有很多函数,这个.c是自动生成的,需要将所有的函数通过extern放到.h中,每个函数都是UINT32 O_开头,通过正则表达式进行字符匹配以及通过linecache来截 ...

  6. 23.week4

    调通了 剩下的就是核心的部分

  7. C#中让WebBrowser运行Javascript脚本

    C#中可以让Webbrowser运行Javascript脚本来实现各种自动化操作,比如点击网页上的按钮,输入用户名密码等等.代码也很简单: >>>>>>>&g ...

  8. 怎么在idea中新建package包,只有directory选项

    http://blog.csdn.net/liyanlei5858/article/details/77320063

  9. 历届试题 对局匹配-(dp)

    问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起.如果两人分差 ...

  10. hibernate 性能问题

    hibernate的目标是快速开发,数据库数据转换为java对象,业务逻辑中只使用对象进行处理. 性能开销有: 数据-对象转换时间,状态记录(是否为脏数据),sql优化(默认是对表字段全部更新,增加网 ...