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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:12:28