如何使用 Jsoup 精准修改 XML 中指定父标签下的 CDATA 值

星伟姑娘_9199

星伟姑娘_9199

2026-11-10

294人浏览

原创

如何使用 Jsoup 精准修改 XML 中指定父标签下的 CDATA 值

本文介绍如何借助 Jsoup 库,在 Java 中安全、高效地定位并替换嵌套在特定父元素(如 SwapTermList)内的 XML 标签(如 trade_qty、fixed_price)中 CDATA 区域的文本内容,避免手动字符串替换带来的风险。

本文介绍如何借助 jsoup 库,在 java 中安全、高效地定位并替换嵌套在特定父元素(如 swaptermlist)内的 xml 标签(如 trade_qty、fixed_price)中 cdata 区域的文本内容,避免手动字符串替换带来的风险。

在处理 SOAP 或企业级 XML 数据时,常需动态更新 或 这类结构中的数值——但这些值被包裹在 CDATA 节点中,且必须限定于特定层级路径(例如仅 SwapTermList 下的 trade_qty,或 SwapTermList → TermPriceList 下的 fixed_price)。若采用 DOM + getTextContent() 简单替换,易误改同名标签;若用正则或字符串 replace(),则极易因格式变化(空格、换行、编码)导致解析失败或注入漏洞。

推荐方案:使用 Jsoup(XML 模式)
Jsoup 虽以 HTML 解析闻名,但其 Parser.xmlParser() 模式可严格按 XML 规范解析命名空间无关的文档(本例中虽含 SOAP-ENV: 前缀,但未实际使用命名空间校验,故完全兼容),并提供类 CSS 选择器语法,语义清晰、链式调用简洁,且天然支持 CDATA 节点操作。

✅ 步骤一:添加依赖(Maven)

<dependency><groupid>org.jsoup</groupid><artifactid>jsoup</artifactid><version>1.18.1</version><!-- 推荐使用最新稳定版 --></dependency>

✅ 步骤二:解析 XML 并定位目标 CDATA 节点

关键在于两点:

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
  1. 强制启用 XML 解析模式:传入 Parser.xmlParser(),禁用 HTML 自动修正;
  2. 精准路径选择:利用 select() / selectFirst() 配合层级关系(空格分隔),直接命中目标元素及其 CDATA 子节点。
import org.jsoup.Jsoup;
import org.jsoup.nodes.CDataNode;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;

public class XmlCDataReplacer {

    public static String replaceCDataValues(String xmlContent, 
                                          String newTradeQty, 
                                          String newFixedPrice) {
        // 1. 以 XML 模式解析(非 HTML!)
        Document doc = Jsoup.parse(xmlContent, "", Parser.xmlParser());

        // 2. 定位所有 SwapTermList 下的 trade_qty 元素(支持多个)
        doc.select("SwapTermList trade_qty").forEach(element -> {
            if (!element.childNodes().isEmpty() && element.childNode(0) instanceof CDataNode) {
                ((CDataNode) element.childNode(0)).text(newTradeQty);
            }
        });

        // 3. 定位 SwapTermList → TermPriceList 下的 fixed_price(仅第一个匹配项)
        Element fixedPriceEl = doc.selectFirst("SwapTermList TermPriceList fixed_price");
        if (fixedPriceEl != null && !fixedPriceEl.childNodes().isEmpty() 
            && fixedPriceEl.childNode(0) instanceof CDataNode) {
            ((CDataNode) fixedPriceEl.childNode(0)).text(newFixedPrice);
        }

        // 4. 返回标准化后的 XML 字符串(禁用美化,保持原始格式)
        doc.outputSettings().prettyPrint(false);
        return doc.outerHtml();
    }

    // 使用示例
    public static void main(String[] args) {
        String originalXml = "..."; // 你的原始 XML 字符串
        String updatedXml = replaceCDataValues(originalXml, "55.5", "99.999");
        System.out.println(updatedXml);
    }
}

⚠️ 注意事项与最佳实践

  • 命名空间处理:本例 XML 声明了 SOAP-ENV 等前缀,但未在元素中实际使用(如 实际为 ),因此 Jsoup 可直接按本地名匹配。若真实存在带前缀的标签(如 ),需使用 select("ns1|GetTradeResponse")(需启用命名空间支持,见 Jsoup 文档)。
  • 空节点防护:务必检查 childNode(0) 是否存在且为 CDataNode 类型,避免 NullPointerException。
  • 性能考量:Jsoup 解析是内存驻留式,适合中小 XML(
  • CDATA vs 普通文本:Jsoup 将 CDATA 内容视为 CDataNode,普通文本为 TextNode。element.text() 会合并所有子文本节点,而 ((CDataNode)node).text() 仅操作 CDATA 内容,更精准。
  • 不推荐的替代方案:
    • ❌ 字符串 replace():无法区分同名标签上下文,易破坏 XML 结构;
    • ❌ DOM setTextContent():可能意外清除 CDATA 标记,降级为普通文本节点;
    • ❌ XPath(需处理命名空间):代码冗长,对简单层级场景“杀鸡用牛刀”。
  • ✅ 总结

    Jsoup 的 XML 解析模式是处理此类“结构化定位 + CDATA 修改”任务的轻量级银弹:语法直观(类似前端开发)、API 稳健、无需额外配置命名空间,且能完美保留原始 XML 格式(缩进、换行、声明)。只要明确目标路径(如 SwapTermList trade_qty),一行选择器即可锁定节点,再通过类型强转操作 CDATA 内容,安全、可读、可维护。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

12297

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

9382

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

8012

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1304

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1028

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1556

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3229

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20471

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1395

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习