【问题标题】:karate does not match xml with namespaces空手道不匹配带有命名空间的 xml
【发布时间】:2019-07-17 01:48:36
【问题描述】:

我有两条带有命名空间的 xml 消息,它们本质上是相同的 xml,但匹配表明它们不一样。

请看下面的功能。 xmlString1 和 xmlString2 本质上是相同的 xml。只有命名空间前缀不同。我不确定匹配是否匹配 xml 相等性? 有没有办法可以实现与命名空间的 xml 匹配?

Feature: Test xml match
  Scenario: test xml match with namespaces
    * def xmlString1 =
    """
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:b="anotherUri">
      <soapenv:Header/>
      <soapenv:Body>
        <b:validateEmailAddressRequest>
          <request>
           <email>some@domain.com</email>
          </request>
         </b:validateEmailAddressRequest>
        </soapenv:Body>
     </soapenv:Envelope>
    """

    * def xmlString2 =
    """
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="anotherUri">
      <soapenv:Header/>
      <soapenv:Body>
        <a:validateEmailAddressRequest>
          <request>
           <email>some@domain.com</email>
          </request>
         </a:validateEmailAddressRequest>
        </soapenv:Body>
     </soapenv:Envelope>
    """

    * xml xml1  = xmlString1
    * xml xml2  = xmlString2

    * match xml1 == xml2

16:49:04.363 [main] ERROR com.intuit.karate - assertion failed: path: /soapenv:Envelope/_/soapenv:Body, actual: '<soapenv:Body><b:validateEmailAddressRequest><request><email>some@domain.com</email></request></b:validateEmailAddressRequest></soapenv:Body>', expected: '<soapenv:Body><a:validateEmailAddressRequest><request><email>some@domain.com</email></request></a:validateEmailAddressRequest></soapenv:Body>', reason: all key-values did not match, expected has un-matched keys: [a:validateEmailAddressRequest]
xml-match.feature:34 - path: /soapenv:Envelope/_/soapenv:Body, actual: '<soapenv:Body><b:validateEmailAddressRequest><request><email>some@domain.com</email></request></b:validateEmailAddressRequest></soapenv:Body>', expected: '<soapenv:Body><a:validateEmailAddressRequest><request><email>some@domain.com</email></request></a:validateEmailAddressRequest></soapenv:Body>', reason: all key-values did not match, expected has un-matched keys: [a:validateEmailAddressRequest]

【问题讨论】:

    标签: karate


    【解决方案1】:

    欢迎您为此提供修复。同时你可以这样做。注意不需要转换成xml,def xml1 就足够了,即使你使用三引号多行形式。您可能会对text 感到困惑。

    * xmlstring xml2 = xml2
    * xml xml2 = xml2.replaceAll('(</?)a:', '$1b:').replace('xmlns:a', 'xmlns:b')
    * match xml1 == xml2
    

    【讨论】:

    • 感谢您的回复。只是一个想法 - 我相信空手道在内部将 xml 转换为 json 映射,而不是尝试匹配它。一种(不好的)方法是删除命名空间前缀,而不是匹配,但它仍然不会匹配 xml 相等性。这仍然是可用且足够的解决方案。
    • 我想改变匹配本身以进行 xml 比较,这样我们就不需要为每个匹配应用解决方法。此外,在您收到来自服务器的响应之前,名称空间前缀是未知的。你怎么看?
    • @Prashant 您是 2.5 年来第一个提出此要求的人。如果可以,请提供修复 - 或者只是使用解决方法。 IMO 这是一个非常罕见的要求
    • 我明白了。还有一件事匹配与 xml 中的 #boolean 和 #number 不匹配。这是缩进行为吗?
    • @Prashant 是的 - 在 XML 中,除非您有模式,否则一切都是字符串,我们保持简单。这不应该阻止你做断言
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2011-01-05
    • 2012-10-15
    相关资源
    最近更新 更多