验证缺少的标记xQuery

时间:2018-04-24 17:28:04

标签: xml xquery soapui

我使用xQuery进行SoapUI的自动化测试,而我在尝试验证Tag是否存在时遇到了一些问题。 我有以下XML:

<Results>
    <ResultSet fetchSize="10">
        <Row rowNumber="1">
            <FCTAAPLI>2309516299-0</FCTAAPLI>
            <FDATA>2017-05-05 00:00:00</FDATA>
            <FVALOR>0.02</FVALOR>
        </Row>
        <Row rowNumber="2">
            <FCTAAPLI>2312518455-1</FCTAAPLI>
            <FDATA>2017-05-05 00:00:00</FDATA>
            <FVALOR>0.54</FVALOR>
        </Row>
    </ResultSet>
</Results>

我试图使用以下代码:

<Results>
{
for $z in //ResultSet/Row
where $z/FCTAAPLI = "${Properties#NUM_APLICACAO}"

return if (string($z) = "")
then 0
else
number($z/FVALOR)
}
</Results>

修改 我想要做的是:遍历元素,搜索特定的FCTAAPLI号码。如果找到该数字,则应返回FVALOR标记上的值。这一点很好。
问题是,当没有元素匹配所需的FCTAAPLI号码时,我想返回0.但是,由于没有返回任何元素,我在验证时遇到了一些麻烦。

当找到FCTAAPLI号码时,一切正常,返回FVALOR,但是当找不到FCTAAPLI时,它只返回标签[&lt;结果/&gt;]。 我尝试使用空($ z)并存在($ z),但它也没有用。 我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:5)

您的“where”条件表示您只对$z/FCTAAPLI = "${Properties#NUM_APLICACAO}"的行感兴趣,但您对问题的描述表明您还希望在不是这种情况的情况下输出。

我不知道string($z) = ""背后的想法是什么。示例数据中的所有行都没有零长度的字符串值,因此我不知道这个条件的目的是什么。

此时我意识到你并没有真正说出你想要查询的内容。你说它在某些条件下有效并且在其他条件下不起作用,但是如果不知道“正确答案”应该是什么,就很难纠正它。

也许你想要的东西是:

<Results>
{
for $z in //ResultSet/Row
return if $z/FCTAAPLI = "${Properties#NUM_APLICACAO}"
       then number($z/FVALOR)
       else 0
}
</Results>

但这是一个非常疯狂的猜测。

== LATER ==

根据您修改的要求声明,您似乎只想要

(//ResultSet/Row
   [FCTAAPLI = "${Properties#NUM_APLICACAO}"]/number($z/FVALOR), 0)[1]

成语

(a/b/c, $default)[1]

在第一次遇到时看起来很奇怪,但它非常有用:如果有a/b/c,则返回$default选择的第一个项目,否则返回@Email private String email;