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

说明:当我们在工作中需要将数据转为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()等方法,另外还有其他方法可供使用,可自行研究。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过Demo学WPF—数据绑定(一)✨

前言✨ 想学习WPF&#xff0c;但是看视频教程觉得太耗时间&#xff0c;直接看文档又觉得似懂非懂&#xff0c;因此想通过看Demo代码文档的方式进行学习。 准备✨ 微软官方其实提供了WPF的一些Demo&#xff0c;地址为&#xff1a;microsoft/WPF-Samples: Repository for WPF …

MySQL:MVCC原理详解

MySQL是允许多用户同时操作数据库的&#xff0c;那么就会出现多个事务的并发场景。那么再并发场景会出现很多问题&#xff1a;脏读、不可重复读、幻读的问题。 而解决这些问题所用到的方法就是&#xff1a;MVCC 多版本并发控制。而这个MVCC的实现是基于read_view、undoLog 如…

Linux部署lomp环境,安装typecho、WordPress博客

部署lomp环境&#xff0c;安装typecho、WordPress博客 一、环境要求1.1.版本信息1.2.准备阿里云服务器【新用户免费使用三个月】1.3.准备远程工具【FinalShell】 二、Linux下安装openresty三、Linux下安装Mysql四、安装Apache【此步骤可省略】4.1.安装Apache服务及其扩展包4.2.…

《HTML 简易速速上手小册》第9章:HTML5 新特性(2024 最新版)

文章目录 9.1 HTML5 新增标签和属性9.1.1 基础知识9.1.2 案例 1&#xff1a;创建一个结构化的博客页面9.1.3 案例 2&#xff1a;使用新的表单元素创建事件注册表单9.1.4 案例 3&#xff1a;创建一个具有高级搜索功能的搜索表单 9.2 HTML5 表单增强9.2.1 基础知识9.2.2 案例 1&a…

制冷机组主要组成元件和功能

组主要组成元件的功能如下&#xff1a; 1&#xff09; 压缩机&#xff1a;主要起吸排气作用&#xff0c;将蒸发后的制冷剂气体吸入压缩机并进行压缩,再排到油分离中&#xff1b; 2&#xff09; 减震管&#xff1a;可有效地防止压缩机的震动传递到管路部分&#xff1b; 3&am…

自然语言处理(NLP)技术使用

自然语言处理&#xff08;NLP&#xff09;技术使用 以下是一些自然语言处理&#xff08;NLP&#xff09;技术的例子&#xff1a;以上只是一些NLP技术的例子&#xff0c;还有许多其他的技术和应用&#xff0c;如文本分类、文本生成、问答系统等。NLP技术的发展正逐渐改变人们与计…

c#窗体捕捉方向键

方法1 实现方法参考代码&#xff1a; private void Form1_Load(object sender, EventArgs e){this.KeyPreview true;}protected override bool ProcessDialogKey(Keys keyData){if (keyData Keys.Left || keyData Keys.Right || keyData Keys.Up || keyData Keys.Down){s…

23种设计模式-结构型模式

1.代理模式 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代品或其占位符。…

ArcGIS Pro 如何计算长度和面积等数据?

要素的几何属性属于比较重要的信息&#xff0c;作为一款专业的GIS软件&#xff0c;ArcGIS Pro自然也是带有计算几何的功能&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的矢量数据&#xff0c;除了矢…

Apache Commons Collection3.2.1反序列化分析(CC1)

Commons Collections简介 Commons Collections是Apache软件基金会的一个开源项目&#xff0c;它提供了一组可复用的数据结构和算法的实现&#xff0c;旨在扩展和增强Java集合框架&#xff0c;以便更好地满足不同类型应用的需求。该项目包含了多种不同类型的集合类、迭代器、队…

备战蓝桥杯---二分(入门)

话不多说&#xff0c;先来个模板题来回顾一下上次讲的&#xff1a; 下面是AC代码&#xff1a; 下面进入正题&#xff1a; 本题对1&#xff0c;2行与3&#xff0c;4行组合&#xff0c;再用二分查找即可实现n^2logn的复杂度。 下面是AC代码&#xff1a; 接题&#xff1a; 让我们…

【Python】03快速上手爬虫案例三:搞定药师帮

文章目录 前言1、破解验证码2、获取数据 前言 提示&#xff1a;通过用户名、密码、搞定验证码&#xff0c;登录进药师帮网站&#xff0c;然后抓取想要的数据。 爬取数据&#xff0c;最终效果图&#xff1a; 1、破解验证码 使用药师帮测试系统&#xff1a;https://dianrc.ysb…

Linux多线程详解

Linux线程和多线程 Linux线程概念什么是线程二级页表线程异常 Linux进程VS线程进程的多个线程共享进程和线程的关系 Linux线程控制线程创建获取线程ID线程终止 分离线程线程ID及进程地址空间布局线程ID及进程地址空间布局 Linux线程概念 什么是线程 在一个程序里的一个执行路…

Docker(第三部分)

1&#xff0c;Docker复杂安装说明 今天的优势会被明天趋势所取代 一切在云端 安装mysql主从复制 主从复制原理&#xff0c;默认你懂 主从搭建步骤 1&#xff0c;新建主从服务器容器实例3307 docker run -p 3307:3306 --name mysql-master\ -v /mydata/mysql-master/log:…

Spring Boot使用七牛云

一、引入和配置 //maven配置 <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.7.0</version> </dependency>#七牛云application.yml配置 qiniu:# 配置accessKeyaccessKey: &qu…

Flask框架小程序后端分离开发学习笔记《5》简易服务器代码

Flask框架小程序后端分离开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后…

计算机毕业设计 | vue+springboot 超市账单管理系统(附源码)

1&#xff0c;绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约&#xff0c;外国人迈克尔库伦开设了第一家合作商店&#xff0c;为了更好地吸引大量客流量&#xff0c;迈克尔库伦精心设计了低价策略&#xff0c;通过大量进货把商品价格压低&#xff0c;通过商店一次性集…

第 6 章:Linux中使用时钟、计时器和信号

在本章中&#xff0c;我们将开始探索Linux环境中可用的各种计时器。随后&#xff0c;我们将深入了解时钟的重要性&#xff0c;并探讨UNIX时间的概念。接下来&#xff0c;我们将揭示在Linux中使用POSIX准确测量时间间隔的方法。之后&#xff0c;我们将进入std::chrono的领域&…

【新书推荐】4.1 运算符与表达式

本节必须掌握的知识点&#xff1a; 运算符 表达式 优先级 4.1.1 运算符 说到运算符与表达式&#xff0c;估计大家不会感到陌生&#xff0c;因为我们平常生活中经常接触到&#xff0c;比如我们买2元钱的馒头&#xff0c;付给老板5元钱&#xff0c;需找零钱3元钱。这中间的计算…

RK3568 Android 13 系统裁剪

android 13 系统裁剪是个大工程&#xff0c;裁剪也是需要大量的测试&#xff0c;才能保证系统的稳定性&#xff0c;以下是RK官方给出的裁剪方案&#xff0c;有兴趣的可以去看一下&#xff0c;对裁剪不是要求过高的可以根据官方的建议&#xff0c;对系统进行裁剪: Rockchip And…