dom4j 操作 xml 之按照顺序插入标签

news2024/12/24 2:14:38

      最近学了一下 dom4j 操作 xml 文件,特此记录一下。

 

public class Dom4jNullTagFiller {

    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();
        //加载 xml 文件
        Document document = reader.read("C:\\Users\\24596\\Desktop\\test.xml");
        //首先获取根元素,然后调用 element 或者 elements 方法获取子元素
        Element root = document.getRootElement();
        // 获取名为 EInvoiceData 的子元素
        Element eInvoiceData = root.element("EInvoiceData");
        //因为需要按照顺序插入标签,所以应该定义好标签的顺序,便于查找之前的标签,并在对应位置插入当前标签
        String[] tagNames = {"ItemName", "SpecMod", "MeaUnits", "Quantity", "UnPrice", "Amount",
                "TaxRate", "ComTaxAm", "TotaltaxIncludedAmount", "TaxClassificationCode"};
        //获取 EInvoiceData 下的名为 IssuItemInformation 的元素列表,因为 EInvoiceData 下有多个 IssuItemInformation ,每个 IssuItemInformation 都需要进行操作,当前也可以获取指定索引的 IssuItemInformation 元素
        List<Element> issuItemInformations = eInvoiceData.elements("IssuItemInformation");
        // 遍历 IssuItemInformation 元素
        for (Element issuItemInformation : issuItemInformations) {
            // 获取 issuItemInformation 下的子元素,方便获取元素的一些信息,比如索引
            List<Element> list = issuItemInformation.elements();
            //因为从1开发,所以需要对索引位置为0的 ItemName 标签进行特殊处理
            if(issuItemInformation.element("ItemName")==null){
                list.add(DocumentHelper.createElement("ItemName").addText(""));
            }
            // 遍历判断 tagNames 中定义的标签是否为空,如果为空,需要按照顺序插入空标签
            for (int i = 1; i < tagNames.length; i++) {
                Element element = issuItemInformation.element(tagNames[i]);
                if (element == null) {
                    Element newElement = DocumentHelper.createElement(tagNames[i]).addText("");
                    // 获取前一个标签的位置,在后面插入空标签
                    list.add(list.indexOf(issuItemInformation.element(tagNames[i-1])) + 1,newElement);
                }
            }
        }
        //这里可以调用 document.asXML() 方法在控制台打印 改变之后的 xml 数据
        //System.out.println(document.asXML());
        // 生成新的 XML 文件
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer;
        try (FileWriter fileWriter = new FileWriter("C:\\Users\\24596\\Desktop\\new.xml")) {
            writer = new XMLWriter(fileWriter, format);
            writer.write(document);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上添加了详细注释的代码,读者可以直接拿来用,需要修改的部分是获取指定元素的名称以及 tagNames 数组。下面展示一下效果图片:

原 xml 文件:

修改之后的 xml 文件:

如果能给你带来帮助,那将是我的荣幸

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

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

相关文章

leetcode刷题总结——字符串匹配

KMP&#xff08;字符串匹配算法&#xff09; 主串或目标串&#xff1a;比较长的&#xff0c;我们就是在它里面寻找子串是否存在&#xff1b; 子串或模式串&#xff1a;比较短的。 前缀&#xff1a;字符串A和B&#xff0c;A BS&#xff0c;S非空&#xff0c;则B为A的前缀。 …

C++从入门到精通(第2版) 中文电子版

前言 C&#xff08;c plus plus&#xff09;是一种计算机高级程序设计语言&#xff0c;由C语言扩展升级而产生&#xff0c;最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。C既可以进行C语言的过程化程序设计&#xff0c;又可以进行以抽象数据类型为特点的基于对…

四、GD32 MCU 常见外设介绍

系统架构 1.RCU 时钟介绍 众所周知&#xff0c;时钟是MCU能正常运行的基本条件&#xff0c;就好比心跳或脉搏&#xff0c;为所有的工作单元提供时间 基数。时钟控制单元提供了一系列频率的时钟功能&#xff0c;包括多个内部RC振荡器时钟(IRC)、一个外部 高速晶体振荡器时钟(H…

Python os模块的强大功能与应用详解

概要 在Python中,os模块提供了与操作系统进行交互的功能,允许我们执行各种操作系统任务,如文件和目录操作、环境变量访问、进程管理等。os模块是标准库的一部分,无需额外安装。本文将详细介绍os模块的功能,并提供相应的示例代码,帮助全面掌握这一强大工具。 os 模块概述…

支付宝低代码搭建电商小程序,无需编程,可视化操作

大家好&#xff0c;我是小悟 在数字化浪潮的推动下&#xff0c;为了更快速、高效地搭建电商小程序&#xff0c;支付宝低代码平台凭借其独特优势&#xff0c;为商家提供了便捷的解决方案。 支付宝低代码平台犹如一座精心打造的智慧工坊&#xff0c;让电商小程序的搭建变得轻而易…

【 香橙派 AIpro评测】烧系统运行部署LLMS大模型跑开源yolov5物体检测并体验Jupyter Lab AI 应用样例(新手入门)

文章目录 一、引言⭐1.1下载镜像烧系统⭐1.2开发板初始化系统配置远程登陆&#x1f496; 远程ssh&#x1f496;查看ubuntu桌面&#x1f496; 远程向日葵 二、部署LLMS大模型&yolov5物体检测⭐2.1 快速启动LLMS大模型&#x1f496;拉取代码&#x1f496;下载mode数据&#x…

【Outlook】从Outlook新版回归经典版全攻略

引言 在微软宣布计划于2024年底淘汰邮件应用&#xff08;Mail app&#xff09;之后&#xff0c;许多用户发现新版Outlook应用&#xff08;Outlook (new)&#xff09;在他们的Windows 11/10系统上自动启动。如果您更倾向于使用经典版Outlook&#xff08;Outlook (classic)&…

大气热力学(11)——热力学图的应用之二(焚风)

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记&#xff0c;现转化为电子版本以作存档。相较于手写笔记&#xff0c;电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 文章目录 11.1 焚风的概念11.2 焚风形成的原理11.3 焚风的示意图 11.1 焚风…

Caido——Burpsuite强有力的竞品工具

0x00 最近发现一个burpsuite的竞品&#xff1a;Caido&#xff0c;尝试使用了一下&#xff0c;发现它的功能还是挺强大的&#xff0c;而且在用户体验上&#xff0c;比Burpsuite要好不少&#xff01;和大家分享一下。 Caido是一款用RUST语言编写的代理工具&#xff0c;目前处于…

nftables(7)集合(SETS)

简介 在nftables中&#xff0c;集合&#xff08;sets&#xff09;是一个非常有用的特性&#xff0c;它允许你以集合的形式管理IP地址、端口号等网络元素&#xff0c;从而简化规则的配置和管理。 nftables提供了两种类型的集合&#xff1a;匿名集合和命名集合。 匿名集合&…

捷配总结的SMT工厂安全防静电规则

SMT工厂须熟记的安全防静电规则&#xff01; 安全对于我们非常重要&#xff0c;特别是我们这种SMT加工厂&#xff0c;通常我们所讲的安全是指人身安全。 但这里我们须树立一个较为全面的安全常识就是在强调人身安全的同时亦必须注意设备、产品的安全。 电气&#xff1a; 怎样预…

【顺序表】算法题 --- 力扣

一、移除元素 移除元素 这个题让我们移除数组nums中值为val的元素&#xff0c;最后返回k&#xff08;不是val的元素个数&#xff09; 这样显然我们就不能再创建一个数组来解决这个问题了&#xff0c;只能另辟蹊径 思路&#xff1a;双指针 这里定义两个指针&#xff08;l1&…

【Python】连接MySQL数据库:详细教程与示例代码

文章目录 1. 安装必要的库2. 建立与MySQL的连接3. 执行SQL查询4. 插入数据5. 更新数据6. 删除数据7. 错误处理8. 小结 在数据驱动的开发中&#xff0c;连接数据库是一个至关重要的技能。Python作为一门强大的编程语言&#xff0c;提供了多种方式连接并操作MySQL数据库。本文将详…

nuitka 打包python程序成windows exe可执行文件

参考&#xff1a; https://www.zhihu.com/question/281858271/answer/2466245521 https://www.zhihu.com/question/281858271 https://zhuanlan.zhihu.com/p/689115995 https://blog.csdn.net/Pan_peter/article/details/136411229 下载&#xff1a; pydantic-2.6.1 pydantic-…

通讯的概念

通讯的概念 文章目录 通讯的概念1.通讯的基本概念2. 串行通讯与并行通讯2. 全双工、半双工及单工通讯3. 同步通讯与异步通讯4. 通讯速率 1.通讯的基本概念 通讯是指在嵌入式系统中实现数据交换的技术手段&#xff0c;它涉及到硬件与硬件、硬件与软件之间的信息传输。基本概念包…

OneForAll工具:安装指南、使用方法及常见问题解决(超全)

引言 在网络安全领域&#xff0c;子域名收集是信息收集过程中非常重要的一步。OneForAll 是一款功能强大的子域名收集工具&#xff0c;能够帮助我们高效地进行子域名收集。本文将详细介绍 OneForAll 的安装和使用方法&#xff0c;并解决在使用过程中可能遇到的问题。 1. OneFo…

手机找回删除的通讯录号码,2个方法,让你不再烦恼

在数字化的浪潮中&#xff0c;我们的手机通讯录如同一张张精心编织的社会网络图谱&#xff0c;每一串数字背后都蕴藏着一段故事或一个重要的联系。然而&#xff0c;生活总会面临小插曲&#xff0c;总有些时候会不慎将通讯录遗失。不用过多担心&#xff0c;本文将会提供一些方法…

Facebook:数字时代的社交瑰宝

在当今数字化飞速发展的时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的领军者&#xff0c;不仅连接了全球数十亿的用户&#xff0c;更深刻地改变了人们的社交方式和生活方式。本文将探讨Facebook如何成为数字时代的社交瑰宝…

Early Convolutions Help Transformers See Better(NeurIPS 2021, Meta)

paper&#xff1a;Early Convolutions Help Transformers See Better 出发点 本文的出发点是解决 ViT 模型在优化性方面的问题。作者假设问题主要出现在 ViT 的早期视觉处理部分&#xff0c;即 "patchify" 过程&#xff0c;这是通过一个大的步幅和大核卷积来实现的…

Linux入门攻坚——28、php、mysql基础

httpdphp&#xff1a;是在httpd中启用模块&#xff0c;不同的工作模式&#xff0c;使用的模块不同 modules httpd&#xff1a;prefork --> libphp5.so httpd&#xff1a;event or worker --> libphp5-zts.so php&#xff1a;引入zend engine后&#xff0c;分为…