问题发生
有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值相同。
实战演示
<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);
}
}
写在最后
dom4j操作xml还是比较简单,有很多的api可用,需要注意在进行pom.xml操作需要保证父子的xmlns一致。
原文地址:https://blog.csdn.net/weixin_39970883/article/details/134748900
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_31976.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!