java对象转换xml比较麻烦,所以可以把对象转换为JSON再把JSON转换为XML
降低复杂度。此工具类依赖于json-lib、fastjson、dom4j等jar包
代码工具:
package com.bsoft.commons.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.*;
/**
* @author :Liujian
* @date :2019/11/15 16:48
* @description:XML和JSON互相转换
* @version:
*/
public class XmlUtil {
private static Logger logger = LoggerFactory.getLogger(XmlUtil.class);
public static String formatXML(String xml) {
String requestXML = null;
try {
// 拿取解析器
SAXReader reader = new SAXReader();
Document document = reader.read(new StringReader(xml));
if (null != document) {
StringWriter stringWriter = new StringWriter();
// 格式化,每一级前的空格
OutputFormat format = OutputFormat.createPrettyPrint();
// xml声明与内容是否添加空行
format.setNewLineAfterDeclaration(false);
// 是否设置xml声明头部
format.setSuppressDeclaration(false);
// 是否分行
format.setNewlines(true);
// 标签自闭合
format.setExpandEmptyElements(true);
// 设置编码格式
format.setEncoding("uft-8");
XMLWriter writer = new XMLWriter(stringWriter, format);
writer.write(document);
writer.flush();
writer.close();
requestXML = stringWriter.getBuffer().toString();
}
return requestXML;
} catch (Exception e) {
System.out.println("格式化xml,失败 --> {}"+e);
return null;
}
}
public static String parseMap(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 (value instanceof HashMap) {
sb.append("<" + key + ">");
parseMap((HashMap<?, ?>) value, sb);
sb.append("</" + key + ">");
} else if (value instanceof ArrayList) {
List<?> list = (ArrayList<?>) map.get(key);
for (int i = 0; i < list.size(); i++) {
sb.append("<" + key + ">");
Map<?, ?> hm = (HashMap<?, ?>) list.get(i);
parseMap(hm, sb);
sb.append("</" + key + ">");
}
} else {
sb.append("<" + key + ">" + value + "</" + key + ">");
}
}
return sb.toString();
}
/**
* w3c Element 转成xml串
* @param element
* @return
* @throws Exception
*/
public static String w3cElementTransferXmlStr(org.w3c.dom.Element element) throws Exception{
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
Source source = new DOMSource(element);
StringWriter out = new StringWriter();
Result output = new StreamResult(out);
transformer.transform(source, output);
out.flush();
String ss = out.toString();
return formatXML(ss);
}
/**
* xml串 转成w3c Element
* @param xmlString
* @return
* @throws Exception
*/
public static org.w3c.dom.Element getElementByString(String xmlString) throws Exception {
if (xmlString == null){
xmlString = "<returnInfo><returnCode>-999</returnCode><description>error</description></returnInfo>";
}
org.w3c.dom.Document doc = null;
Reader strreader = new StringReader(xmlString);
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = builder.parse(new InputSource(strreader));
return doc.getDocumentElement();
}
/**
* Json to xml string.
*
* @param json the json
* @return the string
*/
public static String jsonToXml(String json){
try {
StringBuffer buffer = new StringBuffer();
buffer.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
JSONObject jObj = JSON.parseObject(net.sf.json.JSONObject.fromObject(json).toString());
jsonToXmlStr(jObj, buffer);
return buffer.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* Json to xmlstr string.
*
* @param jObj the j obj
* @param buffer the buffer
* @return the string
*/
public static String jsonToXmlStr(JSONObject jObj,StringBuffer buffer ){
Set<Map.Entry<String, Object>> se = jObj.entrySet();
for(Iterator<Map.Entry<String, Object>> it = se.iterator(); it.hasNext(); )
{
Map.Entry<String, Object> en = it.next();
if(en.getValue().getClass().getName().equals("com.alibaba.fastjson.JSONObject")){
buffer.append("<"+en.getKey()+">");
JSONObject jo = jObj.getJSONObject(en.getKey());
jsonToXmlStr(jo,buffer);
buffer.append("</"+en.getKey()+">");
}else if(en.getValue().getClass().getName().equals("com.alibaba.fastjson.JSONArray")){
JSONArray jarray = jObj.getJSONArray(en.getKey());
for (int i = 0; i < jarray.size(); i++) {
buffer.append("<"+en.getKey()+">");
JSONObject jsonobject = jarray.getJSONObject(i);
jsonToXmlStr(jsonobject,buffer);
buffer.append("</"+en.getKey()+">");
}
}else if(en.getValue().getClass().getName().equals("java.lang.String")){
buffer.append("<"+en.getKey()+">"+en.getValue());
buffer.append("</"+en.getKey()+">");
}else if(en.getValue().getClass().getName().equals("java.lang.Integer")){
buffer.append("<"+en.getKey()+">"+en.getValue());
buffer.append("</"+en.getKey()+">");
}else if(en.getValue().getClass().getName().equals("java.lang.Double")){
buffer.append("<"+en.getKey()+">"+en.getValue());
buffer.append("</"+en.getKey()+">");
}else if(en.getValue().getClass().getName().equals("java.lang.Long")){
buffer.append("<"+en.getKey()+">"+en.getValue());
buffer.append("</"+en.getKey()+">");
}else if(en.getValue().getClass().getName().equals("java.math.BigDecimal")){
buffer.append("<"+en.getKey()+">"+en.getValue());
buffer.append("</"+en.getKey()+">");
}else {
logger.info("class : " + en.getValue().getClass().getName());
}
}
return buffer.toString();
}
/**
* String 转 org.dom4j.Document
* @param xml
* @return
* @throws DocumentException
*/
public static Document strToDocument(String xml){
try {
//加上xml标签是为了获取最外层的标签,如果不需要可以去掉
return DocumentHelper.parseText(xml);
} catch (DocumentException e) {
logger.error(e.getMessage());
return null;
}
}
/**
* org.dom4j.Document 转 com.alibaba.fastjson.JSONObject
* @param xml
* @return
* @throws DocumentException
*/
public static JSONObject xmlToJSONObject(String xml) throws Exception {
return elementToJSONObject(strToDocument(xml).getRootElement());
}
/**
* org.dom4j.Document 转 com.alibaba.fastjson.JSONObject
* @param xml
* @return
* @throws DocumentException
*/
public static String xmlToJSONString(String xml) throws Exception {
JSONObject jsonObject = xmlToJSONObject(xml);
return jsonObject.toString();
}
/**
* org.dom4j.Element 转 com.alibaba.fastjson.JSONObject
* @param node
* @return
*/
public static JSONObject elementToJSONObject(Element node) {
int i = 0;
JSONObject result = new JSONObject();
// 当前节点的名称、文本内容和属性
List<Attribute> listAttr = node.attributes();// 当前节点的所有属性的list
for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
result.put(attr.getName(), attr.getValue());
}
// 递归遍历当前节点所有的子节点
List<Element> listElement = node.elements();// 所有一级子节点的list
if (!listElement.isEmpty()) {
for (Element e : listElement) {// 遍历所有一级子节点
if (e.attributes().isEmpty() && e.elements().isEmpty()) {// 判断一级节点是否有属性和子节点
result.put(e.getName(), e.getTextTrim());// 沒有则将当前节点作为上级节点的属性对待
} else {
if (!result.containsKey(e.getName())){ // 判断父节点是否存在该一级节点名称的属性
// 没有则创建
result.put(e.getName(), elementToJSONObject(e));
} else {
i++;
result.put(e.getName() + "," + i, elementToJSONObject(e));
}
}
}
}
return result;
}
public static void main(String[] args) {
String json = JSONObject.toJSONString(obj, FastJsonUtil.filter, FastJsonUtil.features);
String xml = XmlUtil.jsonToXml(json);
logger.info(XmlUtil.formatXML(xml));
try {
/*JSONObject jsonObject = XmlUtil.xmlToJSONObject(XmlUtil.formatXML(xmlStr));
ResponseBody requestBody1 = JSON.parseObject(jsonObject.toJSONString(), ResponseBody.class);
logger.info(requestBody1.getResponseHead().getBusCode());*/
// xml = XmlUtil.jsonToXml(json1);
// logger.info(XmlUtil.formatXML(xml));
String jsonStr = XmlUtil.xmlToJSONString(xml);
} catch (Exception e) {
logger.error(e.getMessage());
}
}
}