【问题标题】:karate xpath - Can we replace/delete a nodekarate xpath - 我们可以替换/删除节点吗
【发布时间】:2018-11-09 22:41:55
【问题描述】:

我希望通过修改有效的 xml 消息文件来测试错误消息。 我可以在场景中轻松添加这样的节点:

* def invalidDocumentId = read('Valid.xml') * set invalidDocumentId /soapenv:Envelope/soapenv:Body = <tis:extraBonus>Extra</tis:extraBonus> Given request invalidDocumentId

但我还想删除节点、更新节点名称、更改属性名称。 有没有办法设置它或者我需要调用 Java com.intuit.karate.XmlUtils。

【问题讨论】:

    标签: karate


    【解决方案1】:

    首先,删除和添加节点甚至属性应该很容易,只需将removeset 关键字与XPath 一起使用。如果需要,它们会覆盖值。

    * def base = <query><name>foo</name></query>
    * remove base /query/name
    * match base == <query/>
    * set base /query/foo = 'bar'
    * set base /query/@baz = 'ban'
    * match base == <query baz="ban"><foo>bar</foo></query>
    

    好消息是,如果您有一些真的 棘手的 XML 操作要求,字符串 replace 语法会派上用场。这在 Stack Overflow 上的另一个答案中得到了最好的解释:https://stackoverflow.com/a/50367134/143475 | https://stackoverflow.com/a/53682733/143475

    【讨论】:

    • 感谢您的快速回复:) 这涵盖了我正在尝试做的大部分事情。我的最后一个症结是当节点中有命名空间时我试图重命名 {* def base = somewhere/service/…> * replace base.somewhere/service/addPerson"> = '' * replace base. = '' Given request base}这会导致我认为与引号有关的语法错误对于替换中的命名空间
    • @TimFeltham 因为您是 Stack Overflow 的新手,请考虑将答案标记为已接受。嗯,如果你有一个命名空间,也许更简洁的方法是作为第一步使用remove 清除该属性
    • remove 似乎不适用于属性... * remove base /query/@xmlns:tis 不会产生错误但不会删除属性
    • ... 作为一种解决方法,请查看与上面链接的另一个问题的长/完整答案
    • @TimFeltham 无法删除 XML 属性是一个错误,刚刚修复。将在下一个版本中,但我们应该能够很快发布 RC5。感谢您发现这一点! github.com/intuit/karate/issues/407
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多