xml文件和java对象互转

背景:

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

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

操作:

1、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>

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());
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中,可以使用一些库来实现xml、OMElement和Java对象之间的相互转换,以下是一些常见的库和示例: 1. JAXB(Java Architecture for XML Binding):JAXB可以将Java对象序列化为XML文档,也可以将XML文档反序列化为Java对象。示例代码如下: ```java // 将Java对象换为XML文档 JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(student, new File("student.xml")); // 将XML文档换为Java对象 JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); Student student = (Student) unmarshaller.unmarshal(new File("student.xml")); ``` 2. Axiom:Axiom是一个轻量级的XML对象模型,可以将OMElement和Java对象互转换。示例代码如下: ```java // 将Java对象换为OMElement OMFactory factory = OMAbstractFactory.getOMFactory(); OMElement studentElement = AxiomHelper.toOMElement(factory, student); // 将OMElement换为Java对象 Student student = AxiomHelper.fromOMElement(studentElement, Student.class); ``` 3. XStream:XStream是一个快速、简单的Java对象序列化和反序列化库,可以将Java对象序列化为XML文档,也可以将XML文档反序列化为Java对象。示例代码如下: ```java // 将Java对象换为XML文档 XStream xstream = new XStream(); xstream.alias("student", Student.class); String xml = xstream.toXML(student); // 将XML文档换为Java对象 XStream xstream = new XStream(); xstream.alias("student", Student.class); Student student = (Student) xstream.fromXML(xml); ``` 以上是一些常见的库和示例,具体使用哪个库取决于实际需求和个人喜好。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值