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
相关产品推荐
相关产品推荐

