使用Hutool工具包解析、生成XML文件

news2024/11/16 19:35:17

说明:当我们在工作中需要将数据转为XML文件、或者读取解析XML文件时,使用Hutool工具包中的XMLUtil相关方法是最容易上手的方法,本文介绍如何使用Hutool工具包来解析、生成XML文件。

开始之前,需要导入Hutool工具包的依赖

<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.6</version>
</dependency>

XML 转 JavaBean

如下面这个XML文件

<?xml version="1.0" encoding="utf-8"?>
<data>
    <books>
        <book>
            <title>《许三观卖血记》</title>
            <author>余华</author>
            <publish>作家出版社</publish>
        </book>
        <book>
            <title>《罪与罚》</title>
            <author>陀思妥耶夫斯基</author>
            <publish>浙江文艺出版社</publish>
        </book>
        <book>
            <title>《白夜》</title>
            <author>陀思妥耶夫斯基</author>
            <publish>上海译文出版社</publish>
        </book>
    </books>
</data>

经分析,从外至里,我们需要创建以下对象:

(data标签对象,里面包含了books标签对象)

import cn.hutool.core.annotation.Alias;
import lombok.Data;

import java.io.Serializable;

@Data
public class DataBean implements Serializable {

    /**
     * 数据包
     */
    @Alias("books")
    private BooksBean books;
}

(books标签对象,里面有book对象,并且是一个集合)

import cn.hutool.core.annotation.Alias;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class BooksBean implements Serializable {

    /**
     * 书籍列表
     */
    @Alias("book")
    private List<BookBean> books;
}

(book对象,里面是多个属性)

import cn.hutool.core.annotation.Alias;
import lombok.Data;

import java.io.Serializable;

@Data
public class BookBean implements Serializable {

    /**
     * 书名
     */
    @Alias("title")
    private String title;

    /**
     * 作者
     */
    @Alias("author")
    private String author;

    /**
     * 出版社
     */
    @Alias("publish")
    private String publish;
}

需要注意,对应属性上面的注解以及注解里面的名称需要与xml中的标签名对应;

解析XML代码;

        // 读取xml文件
        String xml = FileUtil.readString(new File("data.xml"), "UTF-8");

        // 将xml转换为java对象
        Element rootElement = XmlUtil.getRootElement(XmlUtil.parseXml(xml));

        // 使用根节点下的直接 转成对象
        DataBean dataBean = XmlUtil.xmlToBean(rootElement, DataBean.class);

        // 输出对象数据
        System.out.println(dataBean.getBooks().getBooks());

解析完成

在这里插入图片描述

JavaBean 转 XML

对象转XML是相反的过程,先组装数据,成一个对象。然后依次创建节点标签,将数据放入到标签中。

        // 制造数据
        BookBean bookBean = new BookBean();
        bookBean.setTitle("《活着》");
        bookBean.setAuthor("余华");
        bookBean.setPublish("作家出版社");

        // 创建Books对象
        List<BookBean> beans = new ArrayList<>();
        beans.add(bookBean);

        // 创建xml对象
        Document document = XmlUtil.createXml();

        // 创建data节点
        Element data = document.createElement("data");
        document.appendChild(data);

        // 创建books节点
        Element books = document.createElement("books");
        data.appendChild(books);

        // 创建book节点
        Element book = document.createElement("book");
        books.appendChild(book);

        // 填充数据
        for (BookBean bean : beans) {
            Element title = document.createElement("title");
            title.setTextContent(bean.getTitle());
            book.appendChild(title);

            Element author = document.createElement("author");
            author.setTextContent(bean.getAuthor());
            book.appendChild(author);

            Element publish = document.createElement("publish");
            publish.setTextContent(bean.getPublish());
            book.appendChild(publish);
        }

        // 将document对象转换为xml字符串
        String xmlStr = XmlUtil.toStr(document);

        // 输出
        System.out.println(xmlStr);

转换成功;

在这里插入图片描述

另外,这里的xml是未格式化的,可以通过下面这个方法,输出格式化后的xml

    private String formatXml(Document document) {
        try {
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

            // 将 Document 转换为 Source
            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new StringWriter());

            // 使用 Transformer 对象进行格式化
            transformer.transform(source, result);
            return result.getWriter().toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

将上面的代码换成如下:

        // 将document对象转换为xml字符串,并格式化
        String xmlStr = formatXml(document);

运行看效果

在这里插入图片描述

总结

使用Hutool工具包解析、生成XML文件,使用的是XmlUtil中的XmlUtil.xmlToBean()、XmlUtil.toStr()等方法,另外还有其他方法可供使用,可自行研究。

在这里插入图片描述

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

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

相关文章

力扣hot100 柱状图中最大的矩形 单调栈

Problem: 84. 柱状图中最大的矩形 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public static int largestRectangleArea(int[] height){Stack&l…

疯狂的方块

欢迎来到程序小院 疯狂的方块 玩法&#xff1a;两个以上相同颜色的方块连在一起&#xff0c;点击即可消除&#xff0c;不要让方块到达顶部&#xff0c;消除底部方块哦^^。开始游戏https://www.ormcc.com/play/gameStart/263 html <div id"gameDiv"> <canv…

fiber学习

React原理&#xff1a;通俗易懂的 Fiber - 掘金

nacos启动失败解决

报错信息 Caused by: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (2,937 > 2,048). You can change this value on the server by setting the ‘max_allowed_packet’ variable. 情景复现 最近使用mac正在运行一个nacos的spri…

treeview

QML自定义一个TreeView&#xff0c;使用ListView递归 在 Qt5 的 QtQuick.Controls 2.x 中还没有 TreeView 这个控件&#xff08;在 Qt6 中出了一个继承自 TableView 的 TreeView&#xff09;&#xff0c;而且 QtQuick.Controls 1.x 中的也需要配合 C model 来自定义&#xff0c…

Win10 双网卡实现同时上内外网

因为需要同时上内网和外网&#xff0c;但公司做了网络隔离&#xff0c;不能同时上内外网&#xff0c;所以多加了块无线网卡&#xff0c;配置双网关实现同时上内外网&#xff0c;互不影响 打开 Windows PowerShell&#xff08;管理员&#xff09;&#xff0c;输入&#xff1a;ro…

Github 2024-01-30 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-30统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目2Jupyter Notebook项目2HTML项目1Rust项目1C项目1 稳定扩散Web UI 创建周期&…

C++核心编程:类和对象 笔记

4.类和对象 C面向对象的三大特性为:封装,继承,多态C认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 例如&#xff1a; 人可以作为对象&#xff0c;属性有姓名、年龄、身高、体重...,行为有走、跑、跳、说话...车可以作为对象&#xff0c;属性有轮胎、方向盘、车灯…

万兆网络数据传输-scp加速

在万兆甚至更高的网络带宽场景下 scp 的传输效率并不如人意。毕竟 scp 是旧时代的产物&#xff0c;那时千兆网络都很罕见。以下通过修改压缩方式的方法提升数据的传输速度。同时也采用 nc &#xff0c; bbcp 和 rsync 进行了对比测试。 目录 scp采用默认方式更改压缩算法为 aes…

seata 分布式

一、下载安装seata 已经下载好的朋友可以跳过这个步骤。这里下载的是seata1.6.1这个版本。 1、进入seata官网 地址&#xff1a; https://seata.io/zh-cn/index.html 2、进入下载 3、点击下载地址 下载地址&#xff1a; https://github.com/seata/seata 二、配置seata 进入c…

vue3项目中让echarts适应div的大小变化,跟随div的大小改变图表大小

目录如下 我的项目环境如下利用element-resize-detector插件监听元素大小变化element-resize-detector插件的用法完整代码如下&#xff1a;结果如下 在做项目的时候&#xff0c;经常会使用到echarts&#xff0c;特别是在做一些大屏项目的时候。有时候我们是需要根据div的大小改…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷9

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

redis—Zset有序集合

目录 前言 1.常见命令 2.使用场景 3.渐进式遍历 4.数据库管理 前言 有序集合相对于字符串、列表、哈希、集合来说会有一-些陌生。它保留了集合不能有重复成员的 特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有-个唯- -的浮 点类型的分数(score) …

c语言常量详解 全

c语言常量详解 全 一 常量的基本概念及分类二 常量的存储方式三 c语言常量和变量的具体区别四 字面常量详解4.1 常见类型的字面常量及其示例&#xff1a;4.2 字面常量的使用情况4.3 字面常量的优点 五 const 关键字常量详解5.1 const关键字在C语言中的使用情况&#xff1a;5.2 …

山海鲸可视化大屏:引领企业洞悉市场,提升客户价值的秘密武器

随着大数据时代的到来&#xff0c;企业面临着前所未有的机遇与挑战。如何从海量数据中挖掘出有价值的信息&#xff0c;洞察市场趋势&#xff0c;提升客户价值&#xff0c;成为了企业发展的重要课题。山海鲸可视化企业客户价值分析大屏&#xff0c;为企业提供了一个全新的解决方…

利用外卖系统源码构建高效的在线订餐平台

在当今数字化时代&#xff0c;外卖服务已成为人们日常生活中不可或缺的一部分。为了满足用户需求&#xff0c;许多创业者和企业都希望搭建自己的在线订餐平台。利用现有的外卖系统源码&#xff0c;可以快速构建一个高效、安全的在线订餐平台。本文将介绍如何利用外卖系统源码来…

播报 | 天空卫士入围FreeBuf《CCSIP 2023中国网络安全产业全景图》16个细分领域

2024年1月24&#xff0c;国内安全行业门户FreeBuf旗下FreeBuf咨询正式发布《CCSIP 2023中国网络安全产业全景图》&#xff08;第六版&#xff09;。 天空卫士成功入围SASE、数据防泄露&#xff08;DLP&#xff09;、分类分级、数据安全治理(解决方案)、数据安全管控&#xff08…

Django问题报错:Cannot resolve keyword ‘name‘ into field. Choices are: course, id

笔者在进行登录注册实验用户名已经注册过的操作时报错 一、错误位置 二、问题原因 使用Student模型时参数名错误 三、解决办法 修改为与Student模型中对应的参数名,问题解决

每日一题 力扣514自由之路

514. 自由之路 题目描述&#xff1a; 电子游戏“辐射4”中&#xff0c;任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘&#xff0c;并使用表盘拼写特定关键词才能开门。 给定一个字符串 ring &#xff0c;表示刻在外环上的编码&#xff1b;给定另一…

插值(Python)

插值 插值是数学和计算机科学领域中的一种技术&#xff0c;用于在给定一些离散数据点的情况下&#xff0c;估计在这些点之间的数值。插值的目标是通过某种函数&#xff08;插值函数&#xff09;来逼近或拟合这些离散数据&#xff0c;从而使得在原始数据点之间的数值也有合理的估…