Springboot 整合dom4j 解析xml 字符串 转JSONObject
前言
本文只介绍使用 dom4j 以及fastjson的 方式, 因为平日使用比较多。老的那个json也能转,而且还封装好了XML,但是本文不做介绍。
正文
①加入 pom 依赖
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
② 工具类 MyXmlUtil.java
import com.alibaba.fastjson.JSONArray;
import org.dom4j.*;
import org.springframework.util.StringUtils;
import java.util.List;
/**
* @Author: JCccc
* @Date: 2022-6-15 16:53
* @Description:
*/
public class MyXmlUtil {
public static void main(String[] args) throws DocumentException {
String xmlStr="<dependency>\n" +
" <groupId>org.json</groupId>\n" +
" <artifactId>json</artifactId>\n" +
" <version>20180813</version>\n" +
" </dependency>";
String xmlStrNew="<configuration>\n" +
" <settings>\n" +
" <setting name=\"useGeneratedKeys\" value=\"true\"/>\n" +
" <setting name=\"useColumnLabel\" value=\"true\"/>\n" +
" <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n" +
" <setting name=\"logImpl\" value=\"STDOUT_LOGGING\"/>\n" +
" </settings>\n"+
"</configuration>";
if (StringUtils.hasLength(xmlStr)) {
com.alibaba.fastjson.JSONObject jsonObject2 = MyXmlUtil.documentToJSONObject(xmlStr);
System.out.println(jsonObject2);
}
if (StringUtils.hasLength(xmlStrNew)) {
com.alibaba.fastjson.JSONObject jsonObject2 = MyXmlUtil.documentToJSONObject(xmlStrNew);
System.out.println(jsonObject2);
}
}
/**
* org.dom4j.Document 转 com.alibaba.fastjson.JSONObject
*
* @param xml
* @return
* @throws DocumentException
*/
public static com.alibaba.fastjson.JSONObject documentToJSONObject(String xml) throws DocumentException {
//加上xml标签是为了获取最外层的标签,如果不需要可以去掉
Document document = DocumentHelper.parseText("<xml>" + xml + "</xml>");
return elementToJSONObject(document.getRootElement());
}
/**
* org.dom4j.Element 转 com.alibaba.fastjson.JSONObject
*
* @param node
* @return
*/
public static com.alibaba.fastjson.JSONObject elementToJSONObject(Element node) {
com.alibaba.fastjson.JSONObject result = new com.alibaba.fastjson.JSONObject();
// 当前节点的名称、文本内容和属性
// 当前节点的所有属性的list
List<Attribute> listAttr = node.attributes();
// 遍历当前节点的所有属性
for (Attribute attr : listAttr) {
result.put(attr.getName(), attr.getValue());
}
// 递归遍历当前节点所有的子节点
// 所有一级子节点的list
List<Element> listElement = node.elements();
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(), new JSONArray());
}
// 将该一级节点放入该节点名称的属性对应的值中
((JSONArray) result.get(e.getName())).add(elementToJSONObject(e));
}
}
}
return result;
}
}
运行一下main方法 ,看看效果:
public static void main(String[] args) throws DocumentException {
String xmlStr="<dependency>\n" +
" <groupId>org.json</groupId>\n" +
" <artifactId>json</artifactId>\n" +
" <version>20180813</version>\n" +
" </dependency>";
String xmlStrNew="<configuration>\n" +
" <settings>\n" +
" <setting name=\"useGeneratedKeys\" value=\"true\"/>\n" +
" <setting name=\"useColumnLabel\" value=\"true\"/>\n" +
" <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n" +
" <setting name=\"logImpl\" value=\"STDOUT_LOGGING\"/>\n" +
" </settings>\n"+
"</configuration>";
if (StringUtils.hasLength(xmlStr)) {
com.alibaba.fastjson.JSONObject jsonObject2 = MyXmlUtil.documentToJSONObject(xmlStr);
System.out.println(jsonObject2);
}
if (StringUtils.hasLength(xmlStrNew)) {
com.alibaba.fastjson.JSONObject jsonObject2 = MyXmlUtil.documentToJSONObject(xmlStrNew);
System.out.println(jsonObject2);
}
}
效果:
{"dependency":[{"groupId":"org.json","artifactId":"json","version":"20180813"}]}
{
"configuration": [
{
"settings": [
{
"setting": [
{
"name": "useGeneratedKeys",
"value": "true"
},
{
"name": "useColumnLabel",
"value": "true"
},
{
"name": "mapUnderscoreToCamelCase",
"value": "true"
},
{
"name": "logImpl",
"value": "STDOUT_LOGGING"
}
]
}
]
}
]
}
好了,该篇就到这。