XML格式数据请求的解析与返回XML数据的组织方法

来源:互联网 发布:长春大学教务处软件 编辑:程序博客网 时间:2024/04/30 15:46

因为做服务器很久了,一直没有很好的整理代码的习惯。有个朋友问起了这个问题,觉得可以考虑整理出来供大家参考了。

一、XML格式数据请求的解析,两种方法分别如下:

传入参数举例:<?xml version="1.0" encoding="UTF-8"?><SyncAppOrderReq><MsgType>SyncAppOrderReq</MsgType><AppID>300001489326</AppID></SyncAppOrderReq>

第一种:借助dom4j包,来实现,直接将传入的字符串转为Map。

①定义一个转换的方法XMLUtil

package com.mmpay.util;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;


/**

 * XML解析工具。XML转map

 * @date 2014-11-22 18:39

 * @author Luoyuze 361336079@qq.com

 *

 */

public class XMLUtil {

/**

* 将xml转换为Map

* @param xml

* @return

* @throws Exception

*/

public static Map<String, Object> xml2Map(String xml) throws Exception {

return xmlDoc2Map(DocumentHelper.parseText(xml));

}


/**

* 将xml文件转成Map

* @param xmlDoc

* @return

*/

public static Map<String, Object> xmlDoc2Map(Document xmlDoc) {

Map<String, Object> map = new HashMap<String, Object>();

if (xmlDoc == null) {

return map;

}

Element root = xmlDoc.getRootElement();

for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {

Element e = (Element) iterator.next();

List list = e.elements();

if (list.size() > 0) {

map.put(e.getName(), Dom2Map(e, map));

} else {

map.put(e.getName(), e.getText());

}

}

return map;

}


private static Map Dom2Map(Element e, Map map) {

List list = e.elements();

if (list.size() > 0) {

for (int i = 0; i < list.size(); i++) {

Element iter = (Element) list.get(i);

List mapList = new ArrayList();

if (iter.elements().size() > 0) {

Map m = Dom2Map(iter, map);

if (map.get(iter.getName()) != null) {

Object obj = map.get(iter.getName());

if (!obj.getClass().getName().equals("java.util.ArrayList")) {

mapList = new ArrayList();

mapList.add(obj);

mapList.add(m);

}

if (obj.getClass().getName().equals("java.util.ArrayList")) {

mapList = (List) obj;

mapList.add(m);

}

map.put(iter.getName(), mapList);

} else {

map.putAll(m);

}

} else {

if (map.get(iter.getName()) != null) {

Object obj = map.get(iter.getName());

if (!obj.getClass().getName().equals("java.util.ArrayList")) {

mapList = new ArrayList();

mapList.add(obj);

mapList.add(iter.getText());

}

if (obj.getClass().getName().equals("java.util.ArrayList")) {

mapList = (List) obj;

mapList.add(iter.getText());

}

map.put(iter.getName(), mapList);

} else {

map.put(iter.getName(), iter.getText());

}

}

}

} else {

map.put(e.getName(), e.getText());

}

return map;

}

}

②直接拿传入的参数进行转换,然后就可以直接从map中拿数据来使用。

Map<String, Object> map = XMLUtil.xml2Map(builder.toString());


第二种:借助XStream来实现。

①首先要定义一个类,来映射XML中携带的数据。

这个类的详细信息略了,根据需求自己来写,属性、构造方法和get、set方法。

②利用XStream转换成对象。

XStream xstream=new XStream(new DomDriver()); //注意:不是new Xstream(); 否则报错:
xstream.processAnnotations(SyncAppOrderReq.class);
xstream.alias("SyncAppOrderReq", SyncAppOrderReq.class);
SyncAppOrderReq xml = (SyncAppOrderReq) xstream.fromXML(content);

二、组织返回XML格式数据,与上面对应,也写两种。

第一种:最简单的方法了,就是直接拼接字符串。

这个不用细说,都懂得。

第二种:借助XStream来实现。

①首先要定义一个类,来映射XML中携带的数据。

    ②利用XStream将对象转换成字符串。

SyncAppOrderResp syncAppOrderResp = new SyncAppOrderResp();
syncAppOrderResp.sethRet(0);
syncAppOrderResp.setMsgType("");
syncAppOrderResp.setVersion("");
XStream xstream = new XStream(new DomDriver());
xstream.alias("SyncAppOrderResp", SyncAppOrderResp.class); 
String xml = xstream.toXML(syncAppOrderResp);
xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + xml;





代码都是基于中移互联的支付相关接口写的。

0 0