如何在空手道中将XML响应与Json进行比较 [英] How to compare XML response with Json in Karate
问题描述
我需要将JSON响应与下游XML响应进行匹配和验证.这是这两个示例的响应.
I need to match and validate my JSON response with that of downstream XML response. Here are sample responses for both.
请注意,Json响应参数与XML响应的顺序不相同.
Note that Json response parameters are is not in-order with XML response.
JSON响应
"Main": {
"Cd": "ABC",
"descriptionTxt": "Sample Main",
"type": "A",
"codeType": "P",
"dt": "2018-10-15T00:00:00-05:00",
"validity": "3",
"segment": "Personal"
},
"testList": [
{
"code": "123",
"descriptionTxt": "My Description",
"categoryCd": "DUDU"
},
{
"code": "675",
"descriptionTxt": "His Description"
},
{
"code": "345",
"descriptionTxt": "Your Description",
"categoryCd": "BH"
}
]
XML响应
<S:Body>
<ns4:code>ABC </ns4:code>
<ns5:description>Sample Main</ns5:description>
<ns5:Date>2018-10-15</ns5:Date>
<ns5:Type>A</ns5:Type>
<ns5:codeType>P</ns5:codeType>
<ns5:validity>3</ns5:validity >
<ns5:Segment>PERSONAL </ns5:Segment>
<ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
<ns4:Test>
<ns5:code>123 </ns5:code>
<ns5:description>My Description</ns5:description>
<ns5:categoryCode>DUDU</ns5:categoryCode>
<ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
</ns4:Test>
<ns4:Test>
<ns5:code>345 </ns5:code>
<ns5:description>Your Description</ns5:description>
<ns5:categoryCode>BH</ns5:categoryCode>
</ns4:Test>
<ns4:Test>
<ns5:code>675 </ns5:code>
<ns5:description>His Description</ns5:description>
<ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
</ns4:Test>
推荐答案
如果您花时间发布格式正确的JSON和XML,那还是不错的选择,但是无论如何.我在这里集中讨论一个棘手的问题,这是将重复的XML元素映射到JSON,如果将以下内容粘贴到Scenario
中,则可以看到它的工作原理:
It would have been nice if you took the time to post well-formed JSON and XML, but anyway. I'm focusing on the hard problem here, which is to map repeated XML elements to JSON, if you paste the below into a Scenario
you can see it work:
* def json =
"""
{
"Main": {
"Cd":"ABC",
"descriptionTxt":"Sample Main",
"type":"A",
"codeType":"P",
"dt":"2018-10-15T00:00:00-05:00",
"validity":"3",
"segment":"Personal"
},
"testList":[
{
"code":"123",
"descriptionTxt":"My Description",
"categoryCd":"DUDU"
},
{
"code":"675",
"descriptionTxt":"His Description"
},
{
"code":"345",
"descriptionTxt":"Your Description",
"categoryCd":"BH"
}
]
}
"""
* def xml =
"""
<ns4:root xmlns:ns4="http://foo.com" xmlns:ns5="http://bar.com">
<ns4:Test>
<ns5:code>123</ns5:code>
<ns5:description>My Description</ns5:description>
<ns5:categoryCode>DUDU</ns5:categoryCode>
<ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
</ns4:Test>
<ns4:Test>
<ns5:code>345</ns5:code>
<ns5:description>Your Description</ns5:description>
<ns5:categoryCode>BH</ns5:categoryCode>
</ns4:Test>
<ns4:Test>
<ns5:code>675</ns5:code>
<ns5:description>His Description</ns5:description>
<ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
</ns4:Test>
</ns4:root>
"""
* def list = $xml/root/Test
* def xpath = function(x, p){ try { return karate.xmlPath(x, p) } catch (e) { return '#notpresent' } }
* def fun = function(x){ return { code: xpath(x, '/Test/code'), descriptionTxt: xpath(x, '/Test/description'), categoryCd: xpath(x, '/Test/categoryCode') } }
* def temp = karate.map(list, fun)
* print temp
* print json.testList
* match json.testList contains temp
映射其余的JSON对您来说是一个练习.请参考文档.另请参阅此答案以了解更多想法:空手道-匹配两个动态响应
Mapping the rest of the JSON is an exercise for you. Please refer to the docs. Also see this answer for more ideas: Karate - Match two dynamic responses
这篇关于如何在空手道中将XML响应与Json进行比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!