Karate XPath技术咨询:能否替换或删除XML节点?
Karate中修改XML消息的常用操作技巧
嘿,我来帮你梳理下在Karate里修改XML消息的几种实用操作,大部分场景下不用急着调用Java的com.intuit.karate.XmlUtils,Karate本身就提供了原生语法来搞定这些需求:
添加节点:你已经用
set指令实现了这个功能,写法完全没问题,比如:* def invalidDocumentId = read('Valid.xml') * set invalidDocumentId /soapenv:Envelope/soapenv:Body = <tis:extraBonus>Extra</tis:extraBonus> Given request invalidDocumentId删除节点:用
remove指令就能直接删除指定路径的节点,非常直观。比如要删除Body下的某个特定节点:* remove invalidDocumentId /soapenv:Envelope/soapenv:Body/tis:targetNode如果需要批量删除,还能配合通配符,比如
/soapenv:Envelope/soapenv:Body/tis:*可以删掉Body下所有tis命名空间的节点。更新节点名称:Karate原生没有直接重命名节点的指令,但可以通过“取内容→删原节点→加新节点”的三步操作实现。比如把
<tis:oldName>test</tis:oldName>改成<tis:newName>test</tis:newName>:* def nodeContent = get invalidDocumentId /soapenv:Envelope/soapenv:Body/tis:oldName * remove invalidDocumentId /soapenv:Envelope/soapenv:Body/tis:oldName * set invalidDocumentId /soapenv:Envelope/soapenv:Body = <tis:newName>#(nodeContent)</tis:newName>修改属性名称:思路和重命名节点类似,先获取原属性的值,删除原属性后再添加新属性:
* def attrValue = get invalidDocumentId /soapenv:Envelope/soapenv:Body/tis:someNode/@oldAttrName * remove invalidDocumentId /soapenv:Envelope/soapenv:Body/tis:someNode/@oldAttrName * set invalidDocumentId /soapenv:Envelope/soapenv:Body/tis:someNode/@newAttrName = #(attrValue)
如果遇到特别复杂的XML操作场景(比如批量重命名大量节点/属性、处理嵌套极深的结构),再考虑调用com.intuit.karate.XmlUtils来借助Java DOM API处理,示例如下:
* def xmlDoc = XmlUtils.toDoc(invalidDocumentId) // 这里可以用Java DOM的方法操作xmlDoc,比如重命名节点、修改属性等 * def updatedXml = XmlUtils.toString(xmlDoc) * set invalidDocumentId = updatedXml
内容的提问来源于stack exchange,提问作者Tim Feltham
相关产品推荐
相关产品推荐

