【问题标题】:Is it possible to get XML nodes always as array even if there is only one?即使只有一个,是否可以始终将 XML 节点作为数组获取?
【发布时间】:2019-10-24 12:39:27
【问题描述】:

我正在使用空手道测试一个 SOAP 网络服务。其中一种方法是根据请求,响应可以返回一个或多个巧合。 在将该 XML 响应转换为 JSON 时,如果只有一个结果,则将其解释为一个对象,但如果有更多,则将其解释为一个数组。

有没有什么方法可以使给定的路径始终作为数组返回?

只有一个匹配的 XML 示例:

<matches>
    <product>...</product>
</matches

生成的 JSON 结构:

{ 
    matches: {
        product: ...,
    }
}

具有多个匹配项的 XML 示例:

<matches>
    <product>...</product>
    <product>...</product>
    <product>...</product>
</matches

生成的 JSON 结构:

{ 
    matches: [
        { product: ... },
        { product: ... },
        { product: ... },
    ]
}

查看get 的文档,它说:

get 语法支持的一个便利(但不支持 $ 快捷形式)是如果右侧计算结果为类似列表的结果(例如 JSON 数组),则返回单个元素。 这很有用,因为当您在 JsonPath 中使用通配符 [*] 或搜索过滤器(请参阅下一节)时,您会返回一个数组 - 即使您通常只对第一项感兴趣.

但我一直在尝试并没有让它发挥作用。我不知道这是这样做的方法还是有更好/更有效的方法。

【问题讨论】:

    标签: xml karate


    【解决方案1】:

    不幸的是,不——这确实是 XML 和 JSON 在空手道中工作方式的不同。所以你将不得不做一些自定义逻辑。例如:

    * def temp = { foo: { bar: { a: 1 } } }
    # * def temp = { foo: [{ bar: { a: 1 } }] }
    * if (temp.foo.bar) karate.set('temp', '$.foo', [temp.foo])
    * match temp == { foo: [{ bar: { a: 1 } }] }
    

    因此,如果您确定 JSON 始终必须是一个数组,那么只需 1 行就可以“规范化”它。

    编辑 - 在 Karate 1.X 及更高版本中查看另一种方法:https://stackoverflow.com/a/69043566/143475

    【讨论】:

      猜你喜欢
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2021-09-18
      • 1970-01-01
      相关资源
      最近更新 更多