如何批量替换XML请求中trade_qty标签并替换fixed_price标签最后出现项
解决XML字符串的批量替换与最后一次替换问题
1. 批量替换所有<trade_qty>标签内容
对于所有出现的<trade_qty><![CDATA[OLDQTY]]></trade_qty>(或省略CDATA的形式),直接用String.replace()就能完成全局替换,简洁高效:
// 原始XML字符串 String xml = "...你的XML内容..."; String newQty = "100"; // 代码指定的NEWQTY // 替换所有带CDATA的trade_qty xml = xml.replace("<trade_qty><![CDATA[OLDQTY]]></trade_qty>", "<trade_qty>" + newQty + "</trade_qty>"); // 额外处理可能已省略CDATA的情况(按需选择) xml = xml.replace("<trade_qty>OLDQTY</trade_qty>", "<trade_qty>" + newQty + "</trade_qty>");
如果需要兼容标签内的空格或其他格式,用正则表达式匹配更灵活:
xml = xml.replaceAll("<trade_qty>(?:<!\\[CDATA\\[)?OLDQTY(?:]]>)?</trade_qty>", "<trade_qty>" + newQty + "</trade_qty>");
2. 仅替换最后一次出现的<fixed_price>标签内容
要只替换最后一次出现的目标标签,有两种可靠实现方式:
方式一:字符串截取拼接
String newPrice = "99.9"; // 代码指定的NEWPRICE String targetOld = "<fixed_price><![CDATA[OLDPRICE]]></fixed_price>"; String targetNew = "<fixed_price>" + newPrice + "</fixed_price>"; int lastIndex = xml.lastIndexOf(targetOld); if (lastIndex != -1) { xml = xml.substring(0, lastIndex) + targetNew + xml.substring(lastIndex + targetOld.length()); } // 同样处理省略CDATA的情况 targetOld = "<fixed_price>OLDPRICE</fixed_price>"; lastIndex = xml.lastIndexOf(targetOld); if (lastIndex != -1) { xml = xml.substring(0, lastIndex) + targetNew + xml.substring(lastIndex + targetOld.length()); }
方式二:正则贪婪匹配
利用正则的贪婪特性,匹配到最后一个目标标签前的所有内容,再替换目标部分:
xml = xml.replaceAll("(?s)(.*)<fixed_price>(?:<!\\[CDATA\\[)?OLDPRICE(?:]]>)?</fixed_price>", "$1<fixed_price>" + newPrice + "</fixed_price>");
(?s):开启DOTALL模式,让.匹配换行符(.*):贪婪匹配到最后一个目标标签前的全部内容(?:<!\[CDATA\[)?和(?:]]>)?:可选匹配CDATA前缀后缀,兼容有无CDATA的情况
注意事项
- 若XML结构复杂(含嵌套标签、命名空间),优先用XML解析库(如Dom4j、JAXB)操作,避免字符串替换引发格式错误
- 替换前确保
OLDQTY和OLDPRICE是精准匹配的固定值,防止误替换其他内容
内容的提问来源于stack exchange,提问作者Rassermann
相关产品推荐
相关产品推荐

