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

Karate框架中XML的CDATA内嵌入式表达式无法替换数据咨询

解决Karate中XML CDATA段内嵌入式表达式无法替换的问题

我碰到过好多次这个问题,Karate默认情况下不会解析XML CDATA块里的#()表达式——毕竟CDATA的设计初衷就是让内容以纯文本形式保留,不被XML解析器处理。不过有几个简单的办法能帮你搞定这个需求:

方法1:用karate.render()预渲染CDATA内容

先把CDATA里的内容单独拿出来,用karate.render()完成变量替换,再嵌入到XML请求体中:

# 先获取另一个接口的响应数据
* def response = call read('get-id.feature')

# 预渲染CDATA内的内容,替换#(response.Id)
* def cdataContent = karate.render('<Request><Id>#(response.Id)</Id></Request>', { response: response })

# 构建完整的SOAP请求体,把预渲染后的内容放入CDATA
* def soapRequest = 
"""
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <![CDATA[${cdataContent}]]>
  </soapenv:Body>
</soapenv:Envelope>
"""

方法2:用字符串拼接直接构建CDATA

如果你的CDATA内容比较简单,直接用字符串拼接的方式构建整个XML也是个高效的选择:

# 获取响应中的Id
* def requestId = response.Id

# 用字符串拼接生成包含CDATA的完整XML
* def soapRequest = karate.xml(
    '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' +
    '  <soapenv:Body>' +
    '    <![CDATA[<Request><Id>' + requestId + '</Id></Request>]]>' +
    '  </soapenv:Body>' +
    '</soapenv:Envelope>'
)

这里karate.xml()会把拼接后的字符串转换成Karate可以处理的XML对象,避免格式问题。

方法3:修改XML模板中的CDATA内容

如果你用外部XML模板文件,也可以先读取模板,再替换CDATA里的变量:

# 读取SOAP请求模板
* def soapTemplate = read('soap-request-template.xml')

# 提取CDATA里的文本内容
* def originalCdata = soapTemplate.Envelope.Body.text()

# 替换变量
* def updatedCdata = originalCdata.replace('#(response.Id)', response.Id)

# 将更新后的内容放回CDATA块
* set soapTemplate.Envelope.Body = '<![CDATA[' + updatedCdata + ']]>'

这几个方法都能解决CDATA内表达式不生效的问题,你可以根据自己的场景选最顺手的就行。

内容的提问来源于stack exchange,提问作者user9065498

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:40:53