我在XML匹配方面遇到了麻烦,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>
但是,与此同时,我无法指定我正在使用模板,并且<hello>world</hello>
可能会出现多次。
方案XML 1发生故障,而其他XML仍在工作。
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工作?
答案 0 :(得分: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'
可以随时提交功能请求,并根据您对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匹配的参与程度-不太可能被重构以支持重复的XML元素。
EDIT2:实际上我们现在已经进行了修复,所以这也应该可行:
* match response == <response><foo><bar>#[] bar.bar</bar></foo></response>