JSON对象与XML互相转换

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());
			}


    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值