讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

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

星伟姑娘_9199

星伟姑娘_9199

发布时间:2026-11-10 11:41:06

|

294人浏览过

|

来源于php中文网

原创

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

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

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

在处理 SOAP 或企业级 XML 数据时,常需动态更新 <trade_qty></trade_qty> 或 <fixed_price></fixed_price> 这类结构中的数值——但这些值被包裹在 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 等前缀,但未在元素中实际使用(如 <body></body> 实际为 ),因此 Jsoup 可直接按本地名匹配。若真实存在带前缀的标签(如 <gettraderesponse></gettraderesponse>),需使用 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 内容,安全、可读、可维护。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
java
java

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

12297

2023.06.15

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

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

9382

2023.07.05

java自学难吗
java自学难吗

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

8012

2023.07.31

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

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

1304

2023.08.01

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

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

1028

2023.08.02

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

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

1556

2023.08.02

java有什么用
java有什么用

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

3229

2023.08.02

java在线网站
java在线网站

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

20471

2023.08.03

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

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

精品课程

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

共101课时 | 21.3万人学习

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

共39课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn