如何使用DOM/JDOM解析器替换嵌套标签XML文件中所有标签文本的单引号为双引号
解决JDOM遍历XML替换单引号为双单引号的问题
你这个需求很明确——遍历XML所有节点(包括嵌套的),把文本里的单引号'替换成对的单引号''。先看你给出的代码,有个关键问题需要修正,然后我再给你完整的实现流程。
原代码的核心问题
你写的replaceAll("'", "\'")其实没起到替换效果,因为Java字符串里\'就是单引号本身,等于把单引号替换成单引号,完全没改。正确的写法应该是替换成两个单引号:replace("'", "''")(这里用replace比replaceAll更合适,因为不需要正则匹配,replace会直接替换所有出现的目标字符)。
另外,原代码的逻辑是只有叶子节点(没有子节点)才处理文本,但为了通用性,最好先处理当前节点的文本,再递归子节点——毕竟有些非叶子节点也可能包含文本内容。
修正后的完整实现
下面是包含XML读取、遍历替换、保存的完整可运行代码:
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.File; import java.io.FileWriter; import java.util.List; import java.util.logging.Logger; public class XmlQuoteReplacer { private static final Logger LOGGER = Logger.getLogger(XmlQuoteReplacer.class.getName()); public static void main(String[] args) { try { // 1. 读取目标XML文件 SAXBuilder saxBuilder = new SAXBuilder(); File inputFile = new File("your-input.xml"); // 替换成你的XML文件路径 Document document = saxBuilder.build(inputFile); Element rootElement = document.getRootElement(); // 2. 遍历所有节点并替换单引号 iterateAndReplaceQuotes(rootElement); // 3. 保存修改后的XML(输出到新文件,避免覆盖原文件) XMLOutputter xmlOutput = new XMLOutputter(); xmlOutput.setFormat(Format.getPrettyFormat()); // 保留原文件的缩进格式 xmlOutput.output(document, new FileWriter("your-output.xml")); LOGGER.info("XML单引号替换完成,结果已保存到your-output.xml"); } catch (Exception e) { LOGGER.severe("处理XML时出错: " + e.getMessage()); e.printStackTrace(); } } private static void iterateAndReplaceQuotes(Element parentNode) { // 先处理当前节点的文本内容(去除前后空白,避免处理空文本节点) String currentText = parentNode.getTextTrim(); if (!currentText.isEmpty() && currentText.contains("'")) { String updatedText = currentText.replace("'", "''"); parentNode.setText(updatedText); LOGGER.info("更新节点 [" + parentNode.getName() + "] 的文本: " + updatedText); } // 递归处理所有子节点,确保嵌套节点都被遍历到 List<Element> childNodes = parentNode.getChildren(); for (Element child : childNodes) { iterateAndReplaceQuotes(child); } } }
代码说明
- XML读取:用
SAXBuilder解析XML文件,获取根节点开始遍历。 - 遍历替换逻辑:先处理当前节点的文本,再递归遍历所有子节点,确保所有层级的节点都被检查到;用
getTextTrim()过滤掉空文本或纯空白的节点,避免无效操作。 - XML保存:用
XMLOutputter输出格式化后的XML,保留原文件的缩进结构,避免输出杂乱的文本。
测试你的示例XML
运行代码后,你的示例XML里的两处目标内容会被正确替换:
<Value>HYPER SHIPPING'SDN BHD_First_Page</Value>→<Value>HYPER SHIPPING''SDN BHD_First_Page</Value><Value>Park Street '10 road</Value>→<Value>Park Street ''10 road</Value>
额外注意事项
- 确保项目引入JDOM2依赖(如果用Maven,添加以下依赖):
<dependency> <groupId>org.jdom</groupId> <artifactId>jdom2</artifactId> <version>2.0.6.1</version> </dependency>
- 如果XML里包含CDATA段,当前代码不会处理;如果需要处理CDATA里的单引号,需要额外遍历节点的
getContent(),判断是否为CDATA节点再做替换。
内容的提问来源于stack exchange,提问作者Kashyap Savsani
相关产品推荐
相关产品推荐

