xml文件和java对象互转

背景:

项目中需要使用到xml文件将对象持久化,又需要读取xml文件转成对象操作。JSON数据格式比较常用,所以我们对象格式也用json表现。

对比过hutool的XmlUtil工具和jdom,从易用性角度上,我们采用的jdom

操作:

1、pom依赖

    
        org.jdom
        jdom
        2.0.2
    
    
    
        cn.hutool
        hutool-all
        5.7.19
    

    
        com.alibaba
        fastjson
        1.2.76
    

2、XmlUtil工具类

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * XML工具类
 *
 * @author ppp
 * @date 2022/7/20
 */
public class XmlUtil {

    /**
     * JSON对象转成xml文件
     *
     * @param jsonInfo json信息
     * @param filePath 文件路径,格式:D:\\file\\demo.xml
     * @return 是否成功
     */
    public static boolean jsonToXml(JSONObject jsonInfo, String filePath) throws Exception {
        File file = new File(filePath);
        // 创建根元素
        Element rootElement = new Element("description").setAttribute("title", FileUtil.getPrefix(filePath));
        // 将JSON信息转成Element
        Element xmlElement = convertObjectToXmlElement(jsonInfo, "xml", rootElement);
        Document document = new Document(xmlElement);
        XMLOutputter xmlOut = new XMLOutputter();
        Format format = Format.getPrettyFormat();
        format.setExpandEmptyElements(true);
        xmlOut.setFormat(format);
        try (FileOutputStream filefos = new FileOutputStream(file)) {
            xmlOut.output(document, filefos);
        } catch (IOException e) {
            throw new Exception(StrUtil.format("生成XML文件失败{}", e));
        } finally {
            xmlOut.clone();
        }
        return true;
    }

    /**
     * xml文件转JSON
     *
     * @param filePath xml文件
     * @return JSONObject
     * @throws Exception
     */
    public static JSONObject xmlToJson(String filePath) throws Exception {
        try {
            File file = new File(filePath);
            SAXBuilder saxBuilder = new SAXBuilder();
            Document document = saxBuilder.build(file);
            Element element = document.getRootElement();
            Map elementMap = xmlElementToMap(element);
            return JSON.parseObject(JSON.toJSONString(elementMap));
        } catch (Exception e) {
            throw new Exception(StrUtil.format("解析XML失败,文件地址为【{}】", filePath));
        }
    }

    /**
     * 将对象转成xml元素
     *
     * @param json          对象
     * @param parentElement 父级元素
     */
    private static Element convertObjectToXmlElement(Object json, String code, Element parentElement) {
        Element child;
        String eleStr;
        Object childValue;
        if (json instanceof JSONArray) {
            JSONArray jsonArray = (JSONArray) json;
            for (int i = 0; i < jsonArray.size(); i++) {
                childValue = jsonArray.get(i);
                child = new Element(code);
                parentElement.addContent(child);
                convertObjectToXmlElement(childValue, code, child);
            }
        } else if (json instanceof JSONObject) {
            JSONObject jsonObject = (JSONObject) json;
            for (Object temp : jsonObject.keySet()) {
                eleStr = temp.toString();
                childValue = jsonObject.get(temp);
                child = new Element(eleStr);
                if (childValue instanceof JSONArray) {
                    convertObjectToXmlElement(childValue, eleStr, parentElement);
                } else {
                    parentElement.addContent(child);
                    convertObjectToXmlElement(childValue, eleStr, child);
                }
            }
        } else if (json instanceof Date) {
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            parentElement.setText(sf.format((Date) json));
        } else {
            parentElement.setText(json.toString());
        }
        return parentElement;
    }

    private static Map xmlElementToMap(Element root) {
        List childrenList = root.getChildren();
        Element element = null;
        Map map = new HashMap(16);
        List list = null;
        for (int i = 0; i < childrenList.size(); i++) {
            list = new ArrayList();
            element = (Element) childrenList.get(i);
            if (!element.getChildren().isEmpty()) {
                if (root.getChildren(element.getName()).size() > 1) {
                    if (map.containsKey(element.getName())) {
                        list = (List) map.get(element.getName());
                    }
                    list.add(xmlElementToMap(element));
                    map.put(element.getName(), list);
                } else {
                    map.put(element.getName(), xmlElementToMap(element));
                }
            } else {
                if (root.getChildren(element.getName()).size() > 1) {
                    if (map.containsKey(element.getName())) {
                        list = (List) map.get(element.getName());
                    }
                    list.add(element.getTextTrim());
                    map.put(element.getName(), list);
                } else {
                    map.put(element.getName(), element.getTextTrim());
                }
            }
        }
        return map;
    }

测试:

public static void main(String[] args) throws Exception {
    JSONObject jsonObject = JSON.parseObject("{\"FlowInfo\":[{\"M28\":\"核稿\",\"M29\":\"叶菁\",\"M31\":\"2022-04-19 10:00:00\",\"M30\":\"办公室\",\"M32\":\"请吕校长审签\"},{\"M28\":\"签发\",\"M29\":\"段法雷\",\"M31\":\"2022-04-19 11:00:00\",\"M30\":\"校领导\",\"M32\":\"通过\"}]}");
    XmlUtil.jsonToXml(jsonObject, "E:\\2.0\\packageTemp\\aa.xml");
    JSONObject jsonResult = XmlUtil.xmlToJson("E:\\2.0\\packageTemp\\aa.xml");
    System.out.println(jsonResult.toJSONString());
}

你可能感兴趣的:(java工具类,java,xml,jvm)