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

问题发生

有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
     */
    @Test
    public 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一致。

相关推荐

  1. dom4j生成XML文件

    2023-12-05 20:14:06       61 阅读
  2. 获取xml内容,使用dom4J

    2023-12-05 20:14:06       34 阅读
  3. 使用Dom4j解析多层级XML为Map对象

    2023-12-05 20:14:06       39 阅读
  4. Spring Boot使用dom4j处理xml数据

    2023-12-05 20:14:06       54 阅读
  5. XML 解析异常问题解决

    2023-12-05 20:14:06       31 阅读
  6. Log4j.xml配置说明

    2023-12-05 20:14:06       55 阅读
  7. xml.dom.minidom --- 最小化 DOM 实现

    2023-12-05 20:14:06       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-05 20:14:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-05 20:14:06       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-05 20:14:06       82 阅读
  4. Python语言-面向对象

    2023-12-05 20:14:06       91 阅读

热门阅读

  1. NC56 XML 报文校验出错一例

    2023-12-05 20:14:06       54 阅读
  2. WeakMap

    WeakMap

    2023-12-05 20:14:06      61 阅读
  3. 机器学习(四十九):Mean-Shift 聚类

    2023-12-05 20:14:06       57 阅读
  4. js轮播图示例代码

    2023-12-05 20:14:06       59 阅读
  5. 【软件测试学习】—软件质量需求(四)

    2023-12-05 20:14:06       51 阅读
  6. 第十四周课堂笔记

    2023-12-05 20:14:06       56 阅读
  7. 企业微信HOOK开发接口调用,发送语音消息

    2023-12-05 20:14:06       80 阅读
  8. 《微信小程序开发从入门到实战》学习四十一

    2023-12-05 20:14:06       54 阅读
  9. golang函数的返回值

    2023-12-05 20:14:06       66 阅读