Java代码如何实现xml文件和java对象相互转换呢?

乔欣 Java经验 发布时间:2022-11-28 15:47:34 阅读数:5254 1
下文笔者讲述使用java代码将xml文件和java对象互相转换的方法分享,如下所示

xml格式说明

xml作为一种文件格式
 常用于持久化对象操作,因为xml可采用key和属性的方法存储数据
那么xml信息如何和对象之间相互转换呢?下文笔者将一一道来,如下所示
实现思路:
    使用hutool的XmlUtil工具
	或使用jdom 都可对xml进行操作
例:
xml工具类的编写
 
一、添加pom依赖
    <dependency>
        <groupId>org.jdom</groupId>
        <artifactId>jdom</artifactId>
        <version>2.0.2</version>
    </dependency>
    
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.7.19</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.76</version>
    </dependency>

 
二、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工具类
 */
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("{\"A\":[{\"t1\":\"v1\",\"t2\":\"v2\"}]}");
    XmlUtil.jsonToXml(jsonObject, "D:\\t1.xml");
    JSONObject jsonResult = XmlUtil.xmlToJson("D:\\t1.xml");
    System.out.println(jsonResult.toJSONString());
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202211/16696233124988.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者