Karate 空手道检查xml请求是否包含特定值

Karate 空手道检查xml请求是否包含特定值,karate,Karate,我的空手道模拟服务器将接受XML格式的请求,以下是请求示例: <methodCall> <methodName>MyMethod</methodName> <params> <param> <value> <struct> <member> <name>a</nam

我的空手道模拟服务器将接受XML格式的请求,以下是请求示例:

<methodCall>
<methodName>MyMethod</methodName>
<params>
    <param>
        <value>
            <struct>
                <member>
                    <name>a</name>
                    <value>abc</value>
                </member>
                <member>
                    <name>b</name>
                    <value><i4>2</i4></value>
                </member>
            </struct>
        </value>
    </param>
</params>

根据
methodName
处理请求,但我想根据
包含的内容进行不同的处理。例如:如果请求中包含一个带有
颜色
蓝色
的成员,则我将相应地执行该工作。

可能您考虑过了,您拥有的可能足够了。您只需有条件地返回
响应
。一个技巧是,Karate可以自动将XML转换为JSON,这很方便,因为编写JSON路径查询或过滤操作更容易:

下面是一些示例代码,可以为您提供一些想法:

* def structs = get[0] request..member
* def fun = function(x){ return x.name == 'a' && x.value == 'abc' }
* def test = karate.filter(structs, fun)
* if (test.length) karate.set('response', '<some>response</some>')
*def structs=get[0]请求..成员
*def fun=函数(x){return x.name='a'&&x.value='abc'}
*def测试=空手道。过滤器(结构,乐趣)
*if(test.length)空手道.set('response','response'))
我想重点是您正在尝试进行非平凡的条件处理,因此代码将比通常更复杂

您可以使用JSON path而不是
karate.filter()
hack,但是查询表达式在IMO中可能会变得更难理解。请注意,您可以在
Background
中定义一个函数,例如
getStructType()
,将所有需要的逻辑放入其中,然后在
场景中使用它

* def structs = get[0] request..member
* def fun = function(x){ return x.name == 'a' && x.value == 'abc' }
* def test = karate.filter(structs, fun)
* if (test.length) karate.set('response', '<some>response</some>')