Karate XML:模糊匹配的麻烦

Karate XML:模糊匹配的麻烦,karate,Karate,我在XML匹配方面遇到了问题,它的工作方式似乎与JSON有点不同 我找到了这个代码片段 * def xml = <foo><bar>baz</bar></foo> * set xml/foo/bar = <hello>world</hello> * match xml == <foo><bar><hello>world</hello></bar></foo&g

我在XML匹配方面遇到了问题,它的工作方式似乎与JSON有点不同

我找到了这个代码片段

* def xml = <foo><bar>baz</bar></foo>
* set xml/foo/bar = <hello>world</hello>
* match xml == <foo><bar><hello>world</hello></bar></foo>
*defxml=baz
*设置xml/foo/bar=world
*匹配xml==world
但是有了这个,我不能指定我正在使用一个模板,而且
world
可能会出现多次

场景XML 1失败,而其他场景正在工作

Scenario: Scenario XML 1

    * def response = <response><foo><bar><msg name="Hello"/><msg name="World"/></bar><bar><msg name="Hello"/><msg name="World"/></bar></foo></response>
    * def bar = <bar><msg name="Hello"/><msg name="World"/></bar>
    * def foo = <response><foo>#[](bar)</foo></response>
    * print foo
    * print response
    * match response == foo

Scenario: Scenario XML 2

    * def response = <response><foo><bar><msg name="Hello"/><msg name="World"/></bar></foo></response>
    * def bar = <bar><msg name="Hello"/><msg name="World"/></bar>
    * def foo = <response><foo>#(bar)</foo></response>
    * print foo
    * print response
    * match response == foo

Scenario: Scenario JSON 1
    * def response = {"response": {"foo": [{"bar": [{"msg": "Hello World"},{"msg": "Hello World"}]}, {"bar": [{"msg": "Hello World"},{"msg": "Hello World"}]}]}}
    * def bar = {"bar": [{"msg": "Hello World"},{"msg": "Hello World"}]}
    * def foo = {"response": {"foo": #[](bar)}}
    * print foo
    * print response
    * match response == foo

Scenario: Scenario JSON 2
    * def response = {"response": {"foo": {"bar": [{"msg": "Hello World"},{"msg": "Hello World"}]}}}
    * def bar = {"bar": [{"msg": "Hello World"},{"msg": "Hello World"}]}
    * def foo = {"response": {"foo": #(bar)}}
    * print foo
    * print response
    * match response == foo
场景:场景XML 1
*def响应=
*定义栏=
*def foo=#[](bar)
*印刷食品
*打印响应
*匹配响应==foo
场景:场景XML 2
*def响应=
*定义栏=
*def foo=#(bar)
*印刷食品
*打印响应
*匹配响应==foo
场景:场景JSON 1
*def response={“response”:{“foo”:[{“bar”:[{“msg”:“Hello World”},{“msg”:“Hello World”},{“bar”:[{“msg”:“Hello World”},{“msg”:“Hello World”}]},{
*def bar={“bar”:[{“msg”:“Hello World”},{“msg”:“Hello World”}]}
*def foo={“response”:{“foo”:#[](bar)}
*印刷食品
*打印响应
*匹配响应==foo
场景:场景JSON 2
*def response={“response”:{“foo”:{“bar”:[{“msg”:“Hello World”},{“msg”:“Hello World”}]}
*def bar={“bar”:[{“msg”:“Hello World”},{“msg”:“Hello World”}]}
*def foo={“response”:{“foo”:#(bar)}
*印刷食品
*打印响应
*匹配响应==foo

如何让场景XML 1正常工作?

我承认这可能被认为是一个缺口。XML重复元素与JSON如此不同的事实并没有帮助。我所能做的就是:

* def response = <foo><bar><msg name="Hello"/><msg name="World"/></bar><bar><msg name="Hello"/><msg name="World"/></bar></foo>
* def bar = <bar><msg name="Hello"/><msg name="World"/></bar>
* def foo = <foo>#ignore</foo>
* match response == foo
* match /foo/bar/msg[1]/@name == ['Hello', 'Hello']
* def names = $response/foo/bar/msg[1]/@name
* match each names == 'Hello'
*def响应=
*定义栏=
*def foo=#忽略
*匹配响应==foo
*match/foo/bar/msg[1]/@name=['Hello','Hello']
*def names=$response/foo/bar/msg[1]/@name
*匹配每个名称==“你好”
请随时提交功能请求,并根据您使用JSON的经验提出理想语法的建议

编辑:考虑一下,由于Karate如何在内部将XML转换为类似JSON的数据,您可以选择此选项

* json response = <response><foo><bar><msg name="Hello"/><msg name="World"/></bar><bar><msg name="Hello"/><msg name="World"/></bar></foo></response>
* json bar = <bar><msg name="Hello"/><msg name="World"/></bar>
* match each response.response.foo.bar == bar.bar
* match response == { response: { foo: { bar: '#[] bar.bar' } } }
*json响应=
*json条=
*匹配每个response.response.foo.bar==bar.bar
*匹配响应=={response:{foo:{bar:'#[]bar.bar'}}
我知道这可能有点难理解,但会起作用:)我现在正在看代码,因为JSON匹配涉及的内容太多,所以不太可能重新分解以支持XML重复元素

EDIT2:实际上我们现在已经做了修复,所以这也应该是可能的:

* match response == <response><foo><bar>#[] bar.bar</bar></foo></response>
*匹配响应==#[]bar.bar

刚刚编辑了我的回答谢谢。是否可以在XML内部处理类似#[](bar)的语法,以便将其转换为空手道中的JSON模式?这将允许以XML而不是Json存储模式,因此它们将更接近真实答案,更易于阅读?例如,不是将
#[](bar)
翻译为
“foo”:{“:”#[](bar)}
,而是将其翻译为
“foo”:{#[](bar)}
。@Adrien刚刚进行了编辑,您认为您可以从源代码构建并尝试: