如何通过 Groovy readyAPI 中的另一个子值从父首选项获取子节点值
how to get child node value from a paren preferenced by another child value in Groovy readyAPI
我正在尝试从 readyAPI 中的 Web 服务响应中获取值,这样我就可以将它传递给另一个 Web 服务请求,这样我就可以创建一个自动化测试流程。
我尝试过不同的代码片段,其中大部分是一行代码,如果可能的话我更喜欢这种代码。我可以通过按属性值键入父节点来从节点获取值。我还可以通过子节点属性值获取父节点并使用它来获取另一个子值。
这里有一些例子:
我可以用它来获取子值的第一种格式:
<webserviceResponse>
<documentslist>
<document @id="1">
<payment @currency="USD" >
<amount>1250.00</amount>
</payment>
</document>
<document @id="2">
<payment @currency="JPY" >
<amount>150.00</amount>
</payment>
</document>
<document @id="3">
<payment @currency="EUR" >
<amount>1170.00</amount>
</payment>
</document>
<!-- etc. -->
</documentslist>
-----> 获取特定文档的货币
def webServiceResponse = "webservice#Response"
int index=2
def currency = context.expand('${'+webServiceResponse+'//*:document[@id="['+index+']"]//*:payment/@currency}')
-----> 结果是 "JPY"
<webserviceResponse>
<documentslist>
<document @id="1">
<payment @currency="USD" >
<amount>1250.00</amount>
</payment>
<refund>true</refund>
</document>
<document @id="2">
<payment @currency="JPY" >
<amount>150.00</amount>
</payment>
</document>
<document @id="3">
<payment @currency="EUR" >
<amount>1170.00</amount>
</payment>
<refund>false</refund>
</document>
<!-- etc. -->
</documentslist>
--------> 根据特定节点的存在获得货币
在这个例子中,我们从上到下查找文件,我们找到每个退款节点,
并取与我们第二次看到退款节点在同一块中的货币值。
def webServiceResponse = "webservice#Response"
int index=2
def currrency= context.expand('${'+webServiceResponse+'(//*:refund)['+index+']//parent::*//*:payment/@currency}')
--------> 结果是 "EUR"
这个是我不能用同样的方式取子值。
<webserviceResponse>
<documentslist>
<document>
<key>D_Computer</key>
<currency>USD</currency>
<amount>1250.00</amount>
<refund>true</refund>
</document>
<document>
<key>D_Keyboard</key>
<currency>JPY</currency>
<amount>150.00</amount>
</document>
<document>
<key>D_Monitor</key>
<currency>EUR</currency>
<amount>1170.00</amount>
<refund>false</refund>
</document>
<!-- etc. -->
</documentslist>
我的问题是这个没有任何属性,只有节点的值。顺便说一句,我知道它没有整数,但也许我做错了我没有意识到。
我想获取仅依赖于我将在脚本中指定的 "key" 节点值的金额值。
结果应显示:150.00
感谢您提出非常详细且写得很好的问题。
您可以使用以下内容。你的问题很简单,因为里面没有命名空间。
技术和你展示的一样,只是你不需要使用@作为它的属性
def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
def xml=groovyUtils.getXmlHolder("NameOfRequest#Response");
def currency=xml.getNodeValue("//*:documentslist/*:document[key='${key}']/*:amount");
log.info "Value of $key is " + currency
key="D_Monitor"
currency=xml.getNodeValue("//*:documentslist/*:document[key='${key}']/*:amount");
log.info "Value of $key is " + currency
将 NameOfRequest 替换为您的请求名称
还有一个替代方法。我会 post 它作为一个单独的答案,以免引起混淆。这个还是比另一个好
如果另一个答案由于您的 XML
中的命名空间而无法正常工作,则可以使用 Hashmap 做事的替代方法
试试这个方法
我们首先使用 getNodeValues 获取所有值,然后因为我们有对,所以我们将其放入 hashmap。
现在您可以取回任何东西。
def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
def xml=groovyUtils.getXmlHolder("Request1#Response");
def keys=xml.getNodeValues("//*:documentslist/*:document/*:key")
def amounts=xml.getNodeValues("//*:documentslist/*:document/*:amount")
log.info keys.toString()
log.info amounts.toString()
HashMap h1=[:]
// Add the pair into hashmap and then retrieve
for(int i=0;i<keys.size();i++)
{
h1.put(keys[i],amounts[i])
}
def whichone="D_Computer"
log.info "Value for $whichone is " + h1.get(whichone)
假设您想检索多个值,那么您可以使用数组。
即以数组为键,货币,金额,退款
所以如果你想检索一个键的退款='Z' 所以使用 for 循环你可以知道 Z 出现在数组中的 3 个位置
那么您的退款应该是退款[3]。同样货币[3]和金额[3]
两个答案各有千秋
我正在尝试从 readyAPI 中的 Web 服务响应中获取值,这样我就可以将它传递给另一个 Web 服务请求,这样我就可以创建一个自动化测试流程。
我尝试过不同的代码片段,其中大部分是一行代码,如果可能的话我更喜欢这种代码。我可以通过按属性值键入父节点来从节点获取值。我还可以通过子节点属性值获取父节点并使用它来获取另一个子值。
这里有一些例子:
我可以用它来获取子值的第一种格式:
<webserviceResponse>
<documentslist>
<document @id="1">
<payment @currency="USD" >
<amount>1250.00</amount>
</payment>
</document>
<document @id="2">
<payment @currency="JPY" >
<amount>150.00</amount>
</payment>
</document>
<document @id="3">
<payment @currency="EUR" >
<amount>1170.00</amount>
</payment>
</document>
<!-- etc. -->
</documentslist>
-----> 获取特定文档的货币
def webServiceResponse = "webservice#Response"
int index=2
def currency = context.expand('${'+webServiceResponse+'//*:document[@id="['+index+']"]//*:payment/@currency}')
-----> 结果是 "JPY"
<webserviceResponse>
<documentslist>
<document @id="1">
<payment @currency="USD" >
<amount>1250.00</amount>
</payment>
<refund>true</refund>
</document>
<document @id="2">
<payment @currency="JPY" >
<amount>150.00</amount>
</payment>
</document>
<document @id="3">
<payment @currency="EUR" >
<amount>1170.00</amount>
</payment>
<refund>false</refund>
</document>
<!-- etc. -->
</documentslist>
--------> 根据特定节点的存在获得货币 在这个例子中,我们从上到下查找文件,我们找到每个退款节点, 并取与我们第二次看到退款节点在同一块中的货币值。
def webServiceResponse = "webservice#Response"
int index=2
def currrency= context.expand('${'+webServiceResponse+'(//*:refund)['+index+']//parent::*//*:payment/@currency}')
--------> 结果是 "EUR"
这个是我不能用同样的方式取子值。
<webserviceResponse>
<documentslist>
<document>
<key>D_Computer</key>
<currency>USD</currency>
<amount>1250.00</amount>
<refund>true</refund>
</document>
<document>
<key>D_Keyboard</key>
<currency>JPY</currency>
<amount>150.00</amount>
</document>
<document>
<key>D_Monitor</key>
<currency>EUR</currency>
<amount>1170.00</amount>
<refund>false</refund>
</document>
<!-- etc. -->
</documentslist>
我的问题是这个没有任何属性,只有节点的值。顺便说一句,我知道它没有整数,但也许我做错了我没有意识到。
我想获取仅依赖于我将在脚本中指定的 "key" 节点值的金额值。
结果应显示:150.00
感谢您提出非常详细且写得很好的问题。
您可以使用以下内容。你的问题很简单,因为里面没有命名空间。
技术和你展示的一样,只是你不需要使用@作为它的属性
def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
def xml=groovyUtils.getXmlHolder("NameOfRequest#Response");
def currency=xml.getNodeValue("//*:documentslist/*:document[key='${key}']/*:amount");
log.info "Value of $key is " + currency
key="D_Monitor"
currency=xml.getNodeValue("//*:documentslist/*:document[key='${key}']/*:amount");
log.info "Value of $key is " + currency
将 NameOfRequest 替换为您的请求名称
还有一个替代方法。我会 post 它作为一个单独的答案,以免引起混淆。这个还是比另一个好
如果另一个答案由于您的 XML
中的命名空间而无法正常工作,则可以使用 Hashmap 做事的替代方法试试这个方法
我们首先使用 getNodeValues 获取所有值,然后因为我们有对,所以我们将其放入 hashmap。
现在您可以取回任何东西。
def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
def xml=groovyUtils.getXmlHolder("Request1#Response");
def keys=xml.getNodeValues("//*:documentslist/*:document/*:key")
def amounts=xml.getNodeValues("//*:documentslist/*:document/*:amount")
log.info keys.toString()
log.info amounts.toString()
HashMap h1=[:]
// Add the pair into hashmap and then retrieve
for(int i=0;i<keys.size();i++)
{
h1.put(keys[i],amounts[i])
}
def whichone="D_Computer"
log.info "Value for $whichone is " + h1.get(whichone)
假设您想检索多个值,那么您可以使用数组。 即以数组为键,货币,金额,退款
所以如果你想检索一个键的退款='Z' 所以使用 for 循环你可以知道 Z 出现在数组中的 3 个位置
那么您的退款应该是退款[3]。同样货币[3]和金额[3]
两个答案各有千秋