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
相关产品推荐
相关产品推荐

