You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何修改已存入StringBuilder的XML节点值且不改动原XML文件

实现方案

有两种常用的实现方式,均不会修改源XML文件,所有修改操作都在内存中完成:


方案1:字符串正则替换(轻量,适合XML结构固定场景)

直接在读取到的XML字符串上通过正则匹配标签内容进行替换,无需引入额外依赖,修改后直接输出即可。
修改后完整代码如下:

import java.io.*;
import java.util.logging.Logger;

public class Test {
    // 补充原代码缺失的变量声明
    private int number;
    private String startDate;
    private String endDate;
    private static final Logger LOGGER = Logger.getLogger(Test.class.getName()); 

    public void changeDate() {
        number = 44444444;
        startDate = "2021-01-01";
        endDate   = "2021-03-31";

        try {
            File xmlFile = new File("requests/dates.xml");
            Reader fileReader = new FileReader(xmlFile);
            BufferedReader bufReader = new BufferedReader(fileReader);
            StringBuilder sb = new StringBuilder();
            String line = bufReader.readLine();
            while( line != null ) {
                sb.append(line).append("\n");
                line = bufReader.readLine();
            }
            String request = sb.toString();
            
            // 新增替换逻辑
            // 替换number字段
            request = request.replaceAll("(<ns1:number>)\\d+(</ns1:number>)", "$1" + number + "$2");
            // 替换起始日期
            request = request.replaceAll("(<urn1:dateFrom>)\\d{4}-\\d{2}-\\d{2}(</urn1:dateFrom>)", "$1" + startDate + "$2");
            // 替换结束日期
            request = request.replaceAll("(<urn1:dateTo>)\\d{4}-\\d{2}-\\d{2}(</urn1:dateTo>)", "$1" + endDate + "$2");

            LOGGER.info("Request" + request);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方案2:DOM解析替换(规范,适合XML结构可能变动场景)

通过Java自带的XML解析工具将字符串转为文档对象,精准定位节点修改后再转回字符串,不会受XML缩进、换行等格式变化影响,稳定性更高。
拿到读取后的XML字符串request后,新增以下替换逻辑即可:

// 需提前导入的依赖包
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringReader;
import java.io.StringWriter;

// 替换逻辑代码
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 开启命名空间支持
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new org.xml.sax.InputSource(new StringReader(request)));

// 定位节点修改内容
Node numberNode = doc.getElementsByTagNameNS("*", "number").item(0);
numberNode.setTextContent(String.valueOf(number));
Node dateFromNode = doc.getElementsByTagNameNS("*", "dateFrom").item(0);
dateFromNode.setTextContent(startDate);
Node dateToNode = doc.getElementsByTagNameNS("*", "dateTo").item(0);
dateToNode.setTextContent(endDate);

// 将修改后的Document转回字符串
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
request = writer.toString();

内容的提问来源于stack exchange,提问作者Buster3650

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:36:03