解决dom4j新增xml节点自动加上xmlns=““的问题

news/2025/2/23 0:04:21/

文章目录

    • 问题发生
    • 问题原因
    • 技术积累
    • 问题解决
    • 实战演示
    • 写在最后

问题发生

有pom.xml文件A,有符合pom.xm格式的l字符串B;
字符串B通过DocumentHelper.parseText(str)转成xml文件;
pom.xml文件A通过add(node)方法添加第二步转换完后的pom.xml文件里的节点;
添加后保存pom.xml文件;
打开pom.xml,发现新增的节点属性中有xmlns=“”
在这里插入图片描述

问题原因

这是由于字符串B在转成xml文件时没有指定根节点的命名空间,也就是xmlns所导致的,若父节点没有命名空间属性或者父节点的命名空间值与子节点值不同,则会出现上述情况。

技术积累

dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。

dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。

在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。

如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

问题解决

字符串转xml文件时,根节点需包含xmlns属性,且和主xml文件的根节点xmlns值相同。

实战演示

1、maven pom依赖

<dependency> <groupId>org.slf4j</groupId>  <artifactId>slf4j-api</artifactId>  <version>1.7.28</version> 
</dependency>  
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.0.0</version>
</dependency>

2、dom4j XmlUtil

package com.example.demo.utils;import java.io.File;
import java.io.FileWriter;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** XmlUtil* @author senfel* @version 1.0* @date 2023/12/1 15:53*/
public class XmlUtil {private static final Logger log = LoggerFactory.getLogger(XmlUtil.class);public XmlUtil() {}public static void mergeXmlFragment(String filePath, String parentElementName, String xmlFragment) {try {SAXReader reader = new SAXReader();Document document = reader.read(new File(filePath));Element parentElement = document.getRootElement().element(parentElementName);Document xmlToAdd = DocumentHelper.parseText(xmlFragment);Element rootElementToAdd = xmlToAdd.getRootElement();Element clonedRootElement = (Element) rootElementToAdd.clone();parentElement.add(clonedRootElement);OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8" );XMLWriter writer = new XMLWriter(new FileWriter(filePath), format);writer.write(document);writer.close();System.out.println("XML merge successful!" );} catch (Exception var11) {var11.printStackTrace();}}
}

3、测试用例

package com.example.demo;import com.example.demo.utils.XmlUtil;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;/*** Dom4jTest* @author senfel* @version 1.0* @date 2023/12/1 16:02*/
@SpringBootTest
public class Dom4jTest {/*** mergeXml* @author senfel* @date 2023/12/1 16:08 * @return void*/@Testpublic void mergeXml(){String dependency = "\n" +"        <!-- fastjson -->\n" +"        <dependency xmlns=\"http://maven.apache.org/POM/4.0.0\">\n" +"            <groupId>com.alibaba</groupId>\n" +"            <artifactId>fastjson</artifactId>\n" +"            <version>1.2.78</version>\n" +"        </dependency>";XmlUtil.mergeXmlFragment("D:\\workspace\\demo\\pom.xml", "dependencies", dependency);}
}

4、合并结果
在这里插入图片描述

写在最后

dom4j操作xml还是比较简单,有很多的api可用,需要注意在进行pom.xml操作需要保证父子的xmlns一致。


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

相关文章

Linux 5.15安全特性之landlock

Landlock是一个在Linux内核中实现的安全模型&#xff0c;它允许进程在较低的特权级别下运行&#xff0c;并限制其对内核和系统资源的访问。它提供了一种细粒度的权限控制机制&#xff0c;可以用于创建沙盒环境和隔离敏感操作。 Landlock的实现基于eBPF&#xff08;Extended Be…

[RK-Linux] 移植Linux-5.10到RK3399(三)| 检查eMMC与SD卡配置

这个专题主要记录把 RK Linux-5.10 移植到 ROC-RK3399-PC Pro 的过程。 文章目录 一、eMMC二、SD 卡三、两个接口的区别一、eMMC RK3399 的 eMMC 接口如图: datasheet 介绍: 实际上,连接 eMMC 存储器用的是 SDHCI 接口。SDHCI(Secure Digital Host Controller Interface)…

国内低代码平台有哪些?盘点十大低代码平台排名

国内低代码平台有&#xff1a;1、宜搭&#xff1b;2、织信Informat&#xff1b;3、轻舟&#xff1b;4、JeecgBoot&#xff1b;5、J2PaaS&#xff1b;6、活字格&#xff1b;7、明道云&#xff1b;8、搭搭云&#xff1b;9、JePaaS 平台&#xff1b;10、华炎魔方。其中织信Informa…

Redis如何保证与数据库的一致性

双写一致性 redis与数据库不一致的两种情况解决办法 redis与数据库不一致的两种情况 出现在高并发场景下&#xff0c;当有数据读和写的请求&#xff0c;就可能出现数据库与缓存不一致的情况 一、先操作删除缓存&#xff0c;再修改数据库数据的情况下 当缓存被线程一删除后&…

制作一个RISC-V的操作系统四-嵌入式开发介绍

文章目录 什么是嵌入式开发交叉编译查看一些GCC文件夹 调试器GDB相关语法命令 模拟器QEMUQEMU的安装和使用项目构造工具MakeMakeFile的构成make的运行 练习4-1练习4-2练习4-3 什么是嵌入式开发 程序跑到开发板上&#xff0c;或者说运行到硬件上 交叉编译 简单理解交叉编译来说…

初识Linux:权限(1)

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 Linux 的权限 内核&#xff1a; 查看操作系统版本 查看cpu信息 查看内存信息 外部程序&#xff1a; 用户&#xff1a; 普通用户变为超级用户&#xff1a; su 和 su-的区别&#xff1a; root用户变成普通用户&#…

将输入的字符串反向输出(c语言)

#include<stdio.h> #include<string.h> int main() {int i, j, k;char s[50], temp;gets(s);//输入k strlen(s);//计算字符的长度//反向输出for (i 0, j k - 1;i < k / 2;i, j--){temp s[i];s[i] s[j];s[j] temp;}puts(s);//输出 }

Stream 流

配合Lambda表达式&#xff0c;简化集合和数组的操作 文章目录 一、获取Stream流对象集合数组零散的数据 二、中间方法filter()limit(Long maxSize)skip(Long n)distinct()concat(Stream a, Stream b) 三、终结方法forEach()count() 四、收集操作collect(Collector collector) …