如何通过 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]

两个答案各有千秋