Springboot 整合dom4j 解析xml 字符串 转JSONObject

news/2025/2/21 7:11:02/

前言


本文只介绍使用  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();// 当前节点的名称、文本内容和属性// 当前节点的所有属性的listList<Attribute> listAttr = node.attributes();// 遍历当前节点的所有属性for (Attribute attr : listAttr) {result.put(attr.getName(), attr.getValue());}// 递归遍历当前节点所有的子节点// 所有一级子节点的listList<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"

                        }

                    ]

                }

            ]

        }

    ]

}

好了,该篇就到这。 


http://www.ppmy.cn/news/32828.html

相关文章

记HTTP数据格式

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录一、HTTP简介&#x1f353;协议特点二、请求数据格式&#x1f34e;1.请求行2.请求头3.请求体三、响应数据格式&#x1f34e;1.响应行2.响应头3.响应体一、HTTP简介&#x1f353; 全称&#xff1a;HyperText Tran…

如何从 MySQL 读取 100w 数据进行处理

文章目录 场景常规查询流式查询MyBatis 流式查询接口非流式查询和流式查询区别游标查询场景 大数据量操作的场景大致如下: 1、 数据迁移; 2、 数据导出; 3、 批量处理数据; 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理。…

FastText:高效的文本分类工具

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

突发——字节跳动被要求出售 TikTok 股票,否则禁令,低代码也曾被打压

一、欲加之罪&#xff0c;何患无辞&#xff01; 正值人们对TikTok和其它社交媒体平台对年轻用户的影响进行更广泛、持续的反思之际&#xff0c;美政客们以数据安全为由要求TikTok出售股票&#xff0c;已然不顾文明国家的体面。 在美国&#xff0c;TikTok拥有1.4亿用户&#x…

STM32实战-无源蜂鸣器

前言&#xff1a; 主要通过无源蜂鸣器实现功能有&#xff1a; 1、上电后&#xff0c;无源蜂鸣器发出警报声&#xff1b; 2、通过触摸按键1打开或关闭蜂鸣器; 目录 1、硬件电路部分 2、技术讲解 2.1通用定时器&#xff08;TIMx&#xff09; 2.2主要特性 2.3框图 3.软件…

【产品经理】B端产品规划和Roadmap怎么做?

在开发一款产品前&#xff0c;首先要做好产品规划&#xff0c;确定产品定位和业务方向&#xff0c;为将来的版本规划提供大方向的参考。那么&#xff0c;如何做好产品规划&#xff1f; 01 什么是产品规划&#xff1f; 一句话说明&#xff1a;产品规划即基于行业发展趋势、企业…

super(NeuralNetwork, self).__init__() 与 super().__init__()

我们在浏览别人的代码&#xff0c;有的时候遇到 super(NeuralNetwork, self).__init__() &#xff0c;也有的时候遇到什么都没有的情况&#xff0c;如 super().__init__()&#xff0c;这二者究竟有什么区别呢&#xff1f; super(NeuralNetwork, self).__init__() 和 super()._…

每日学术速递3.17

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Breaking Common Sense: WHOOPS! A Vision-and-Language Benchmark of Synthetic and Compositional Images 标题&#xff1a;打破常识&#xff1a;哎呀&#xff01;合成和合成图像…