dom4j实现xml转map,xml转json字符串

news2024/11/6 5:07:37

 dom4j依赖包

        <!--dom4j-->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

map转为json字符串方法很多,这里使用fastjson

        <!--fastjson 版本1.2.78是Fastjson在发布时的最后一个支持Java 1.7的版本-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>

dom4j实现xml转map,再使用 fastjson 将map转为json字符串

package com.study;

import com.alibaba.fastjson.JSON;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) throws Exception {
        String xml = "<sites><site><name>RUNOOB</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site><site><name>Facebook</name><url>www.facebook.com</url></site></sites>";
        Map<String, Object> map = xml2map(xml);
        String json = JSON.toJSONString(map);
        System.out.println(json);
    }

    /**
     * xml转map 不带属性
     */
    public static Map<String, Object> xml2map(String xml) throws DocumentException {
        // xml必须有一个根节点
        xml = "<root>" + xml + "</root>";
        Document document = DocumentHelper.parseText(xml);
        Element root = document.getRootElement(); //根节点
        Map<String, Object> map = xml2map(root);
        return map;
    }

    /**
     * xml转map 不带属性
     * 如果是兄弟元素,并且兄弟元素的标签相同,那么这些相同名称的兄弟需要合并为一个数组
     */
    private static Map<String, Object> xml2map(Element element) {
        Map<String, Object> map = new LinkedHashMap<>();
        List<Element> list = element.elements(); //获取所有子节点
        if (list.size() > 0) { //有子节点
            for (Element iter : list) { //遍历所有子节点
                List<Object> mapList;
                if (iter.elements().size() > 0) { //子节点还有子节点
                    Map<String, Object> m = xml2map(iter); //递归调用
                    if (map.get(iter.getName()) != null) { //标签名称已经存在,说明是一个数组结构
                        Object obj = map.get(iter.getName());
                        if (obj instanceof List) { //标签的值是数组结构,取出数组添加新的元素
                            mapList = (List) obj; //取出旧值
                            mapList.add(m); //放入新值
                        } else {
                            mapList = new ArrayList<>();
                            mapList.add(obj); //放入旧值
                            mapList.add(m); //放入新值
                        }
                        map.put(iter.getName(), mapList);
                    } else {
                        map.put(iter.getName(), m);
                    }
                } else { //子节点无子节点
                    if (map.get(iter.getName()) != null) { //标签名称已经存在,说明是一个数组结构
                        Object obj = map.get(iter.getName());
                        if (obj instanceof List) { //标签的值是数组结构,取出数组添加新的元素
                            mapList = (List) obj; //取出旧值
                            mapList.add(iter.getText()); //放入新值
                        } else {
                            mapList = new ArrayList<>();
                            mapList.add(obj); //放入旧值
                            mapList.add(iter.getText()); //放入新值
                        }
                        map.put(iter.getName(), mapList);
                    } else {
                        map.put(iter.getName(), iter.getText());
                    }
                }
            }
        }
        return map;
    }

}

效果如下:

<sites>
    <site>
        <name>RUNOOB</name>
        <url>www.runoob.com</url>
    </site>
    <site>
        <name>Google</name>
        <url>www.google.com</url>
    </site>
    <site>
        <name>Facebook</name>
        <url>www.facebook.com</url>
    </site>
</sites>

xml转换为json后效果

{
	"sites": {
		"site": [
			{
				"name": "RUNOOB",
				"url": "www.runoob.com"
			},
			{
				"name": "Google",
				"url": "www.google.com"
			},
			{
				"name": "Facebook",
				"url": "www.facebook.com"
			}
		]
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker-- cgroups资源控制实战

上一篇&#xff1a;容器化和虚拟化 什么是cgroups&#xff1f; cgroups是Linux内核中的一项功能&#xff0c;最初由Google的工程师提出&#xff0c;后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内&#xff0c;从而为系统…

解决ImportError: DLL load failed while importing _message: 找不到指定的程序。

C:\software\Anoconda\envs\yolov5_train\python.exe C:\Project\13_yolov5-master\train.py C:\software\Anoconda\envs\yolov5_train\lib\site-packages\torchvision\io\image.py:13: UserWarning: Failed to load image Python extension: [WinError 127] 找不到指定的程序…

超越Axure:探索新一代原型设计工具

Axure RP是一款被广泛认可的快速原型设计工具&#xff0c;专为专业设计师打造&#xff0c;用于创建高效的产品原型图&#xff0c;包括APP和网页的原型图、框架图和结构图等。Axure RP制作的原型图能够实现与实际APP相似的交互效果&#xff0c;便于向用户或客户展示&#xff0c;…

综合项目--博客

一。基础配置&#xff1a; 1.配置主机名&#xff0c;静态IP地址 2.开启防火墙配置 3.部分开启selinux并且配置 4.服务器之间使用同ntp.aliyun.com进行世家能同步 5.服务器之间实现SSH绵密登陆 二。业务需求 1.Sever-NFS-DNS主机配置NFS服务器&#xff0c;将博客网站资源…

dns欺骗

[[Ettercap]] 少不了这个 arp 毒化和流量截取的中间人工具。 dns欺骗原理 什么是 DNS 欺骗&#xff1f; DNS 欺骗&#xff08;DNS Spoofing&#xff09; 是一种网络攻击技术&#xff0c;攻击者通过修改 DNS 响应&#xff0c;将目标用户的 DNS 查询结果篡改&#xff0c;指向攻…

危机来临前---- 力扣: 876

危机即将来临 – 链表的中间节点 描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例&#xff1a; 何解&#xff1f; 1、遍历找到中间节点 &#xff1a; 这个之在回文链表中找…

SQL Server数据库中,报错:用户名或密码不正确

1、 用户名或密码不正确 2、解决方式 可能是服务器名称不对&#xff0c;检查服务器名称是否是安装sqlserver数据的服务器名称。安装sqlserver数据的服务器&#xff0c;没有开启1433端口&#xff0c;需要开启端口 下一步保证&#xff1a;TCP/IP 状态状态为&#xff1a;已启用 然…

PKG_CHECK_MODULES(FUSE,fuse)

运行 ./configure 命令报错如下&#xff1a; ./configure: line 13934: syntax error near unexpected token FUSE,fuse ./configure: line 13934: PKG_CHECK_MODULES(FUSE,fuse)解决方案&#xff1a; 命令窗口运行如下命令&#xff0c;安装 pkg-config&#xff1a; sudo …

不要只知道deepl翻译,这里有10个专业好用的翻译工具等着你。

deepl翻译的优点还是有很多的&#xff0c;比如翻译的准确性很高&#xff0c;支持翻译的语言有很多&#xff0c;并且支持翻译文件和文本。但是现在翻译工具那么多&#xff0c;大家需要翻译的场景也有很多&#xff0c;怎么能只拥有一个翻译工具呢。所以在这里我帮助大家寻找了一波…

如何检索 LINEMOD 数据集的相机内参

简介 BOP (Benchmark for 6D Object Pose Estimation) 是一个专为6D物体姿态估计而设计的基准测试平台。它为研究人员提供了多种数据集&#xff0c;以帮助评估和比较物体识别和姿态估计算法的性能。官方网站是 BOP&#xff0c;你可以在这里找到丰富的资源和信息。 检索 LINEM…

健康生活的重要性,注重规律作息

在快节奏的现代生活中&#xff0c;健康已成为我们最宝贵的财富。随着生活水平的提高&#xff0c;人们越来越注重养生&#xff0c;追求身心的和谐与平衡。那么&#xff0c;如何在繁忙的日常中实践健康养生&#xff0c;为生活注入新的活力呢&#xff1f;以下是一些实用的建议&…

最简单方式SSH连接局域网中另一台电脑的WSL2

1、首先确认一下WSL2中的SSH服务是否开启&#xff1a; 先安装更新一下&#xff0c;再安装一下ssh服务模块&#xff0c;这里很多人都没有安装过。 sudo apt update sudo apt upgrade sudo apt install openssh-server 2、配置SSH服务器&#xff1a; 打开配置文件&#xff0c…

andrular输入框input监听值传递

效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\apple\apple.component.html <button mat-button (click)“openDialog()”>Open dialog step2: E:\projectgood\ajnine\untitled4\src\app\apple\apple.component.ts import {Component, inject}…

数据结构——二叉树(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ 在上一篇博客我们…

动态规划 —— dp问题-按摩师

1. 按摩师 题目链接&#xff1a; 面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/the-masseuse-lcci/description/ 2. 算法原理 状态表示&#xff1a;以某一个位置为结尾或者以某一个位置为起点 dp[i]表示&#xff1a;选择到i位置…

python爬取旅游攻略(1)

参考网址&#xff1a; https://blog.csdn.net/m0_61981943/article/details/131262987 导入相关库&#xff0c;用get请求方式请求网页方式&#xff1a; import requests import parsel import csv import time import random url fhttps://travel.qunar.com/travelbook/list.…

C++设计模式创建型模式———原型模式

文章目录 一、引言二、原型模式三、总结 一、引言 与工厂模式相同&#xff0c;原型模式&#xff08;Prototype&#xff09;也是创建型模式。原型模式通过一个对象&#xff08;原型对象&#xff09;克隆出多个一模一样的对象。实际上&#xff0c;该模式与其说是一种设计模式&am…

基于STM32的智能温室环境监测与控制系统设计(代码示例)

一、项目概述 在现代农业中&#xff0c;智能大棚能够通过环境监测、数据分析和自动控制等技术手段&#xff0c;实现对作物生长环境的精细化管理。本项目旨在设计一个基于STM32单片机的智能大棚系统&#xff0c;能够实时监测光照强度、空气温湿度及土壤湿度&#xff0c;并根据设…

(五)Web前端开发进阶2——AJAX

目录 1.Ajax概述 2.Axios库 3.认识URL 4.Axios常用请求方法 5.HTTP协议——请求报文/响应报文 6.HMLHttpRequest对象 7.前后端分离开发&#xff08;接口文档&#xff09; 8.Element组件库 1.Ajax概述 AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。…

进程信号——信号的保存

信号的概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注意,阻塞和忽略是不同的,只要信号…