背景:
项目中需要使用到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());
}