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

如何利用Apache StringUtils或正则表达式替换XML中CDATA块内的动态XML内容

可行的CDATA内容替换方案

我来给你几个实用的实现方案,都是适配Java生态的(毕竟你已经在使用Apache Commons的StringUtils),可以根据你的场景选择:

方案1:用Apache Commons StringUtils的replaceBetween方法(最省心)

既然你已经熟悉substringBetween,那它的配套方法replaceBetween正好能解决你的问题——专门用来替换两个分隔符之间的内容,完全不需要自己处理字符串截取逻辑:

import org.apache.commons.lang3.StringUtils;

// 你的原始XML字符串
String originalXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<envelope>\n  <xxxx>\n    <yyyy>\n      <![CDATA[\n        旧XML内容\n      ]]>\n    </yyyy>\n  </xxxx>\n</envelope>";
// 准备好要替换进去的新XML内容
String newInnerXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<Document>\n  <eee>\n    <!-- 新的节点内容 -->\n  </eee>\n</Document>";

// 直接替换CDATA标记之间的内容
String updatedXml = StringUtils.replaceBetween(originalXml, "<![CDATA[", "]]>", newInnerXml);

这个方法会自动匹配第一个<![CDATA[和对应的]]>,把中间的旧内容替换成你传入的新XML,代码简洁又不易出错。

方案2:正则表达式(无依赖场景)

如果你不想依赖第三方工具类,可以用正则表达式来匹配CDATA块。注意要开启DOTALL模式,让正则的.能匹配换行符(因为CDATA里的XML通常是多行的):

import java.util.regex.Matcher;
import java.util.regex.Pattern;

String originalXml = "...";
String newInnerXml = "...";

// 编译正则,转义特殊字符并开启DOTALL模式
Pattern cdataPattern = Pattern.compile("<\\!\\[CDATA\\[(.*?)\\]\\]>", Pattern.DOTALL);
Matcher matcher = cdataPattern.matcher(originalXml);

// 替换第一个匹配的CDATA块(如果要替换所有用replaceAll)
String updatedXml = matcher.replaceFirst("<![CDATA[" + newInnerXml + "]]>");

⚠️ 注意:如果你的XML里存在多个CDATA块,replaceAll会替换所有匹配项,根据你的实际需求选择即可。另外标准XML中CDATA块不能嵌套,所以这个正则是安全的。

方案3:用XML解析库(最稳妥,适合复杂XML)

如果你的XML结构复杂,或者需要频繁操作XML节点,用专业的XML解析库(比如JDOM2、DOM4J)会更可靠,避免字符串操作带来的潜在问题:

以JDOM2为例:

import org.jdom2.CDATA;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.StringReader;

String originalXml = "...";
String newInnerXml = "...";

// 解析原始XML
SAXBuilder saxBuilder = new SAXBuilder();
Document doc = saxBuilder.build(new StringReader(originalXml));

// 定位到包含CDATA的<yyyy>节点(根据你的XML层级调整)
Element targetElement = doc.getRootElement()
                           .getChild("xxxx")
                           .getChild("yyyy");

// 清空原有内容,添加新的CDATA块
targetElement.removeContent();
targetElement.addContent(new CDATA(newInnerXml));

// 输出更新后的XML
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
String updatedXml = outputter.outputString(doc);

这个方案的优势是直接操作XML节点,不用关心字符串的具体位置,即使XML结构有微小变化也能适配,适合生产环境的复杂场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:44:04