我有以下xml查询:
<return>
<code>success</code>
<message/>
<deal>
<checksum>203591</checksum>
<documentID>21783</documentID>
<dealStatus>P</dealStatus>
<financing>
<financeType>L</financeType>
<term>32</term>
</financing>
<options>
<disclosureType/>
<frontBackFlag>P</frontBackFlag>
<hardSoftFlag>M</hardSoftFlag>
<optionCode>TO</optionCode>
<optionDescription>QAfhggddate DOCID 219</optionDescription>
<optionOrigin>xxx</optionOrigin>
<optionPrice>
<optionPricingType>INVIICE</optionPricingType>
<price>111.99</price>
</optionPrice>
<optionPrice>
<optionPricingType>RETAIL</optionPricingType>
<price>2.99</price>
</optionPrice>
<optionResidualAmount>3.99</optionResidualAmount>
<residualTableAmount>0.00</residualTableAmount>
<residualTableFlag>N</residualTableFlag>
<satisfiedDate>2012-05-08T00:00:00-06:00</satisfiedDate>
</options>
</deal>
</return>
我需要设置一个检查点来验证上述响应是否只包含我们的规范中提到的字段。例如。 optionPrice应该只有optionPricingType&amp;所以如何编写xpath或xqery来获取optionPrice下的所有标签标签而没有它们的值。
我正在使用SOAP UI来放置断言
答案 0 :(得分:2)
根据SoapUI的“Functional Testing”文档,您可以对架构合规性进行断言。我建议使用此工具来验证响应是否符合您的规范。
如果您想/必须使用XPath,这里有一些想法。假设在SoapUI中可以使用XPath 2.0“XPath和XQuery Match断言都使用Saxon XPath / XQuery处理器,该处理器支持该领域的大多数最新标准。”参考:Validating XML Messages
(#2续......)你可以测试已知元素的存在(所有预期结果都是真的):
boolean(/return)
boolean(/return/code)
boolean(/return/deal)
boolean(/return/deal/checksum)
等。请注意,这不会测试元素排序,这可能对您有意义,也可能不重要。
您可以测试是否存在未知元素(预期结果为真):
min(for $elName in //*/local-name() return $elName = ('return','code','message','deal','checksum','documentID','dealStatus','financing','financeType','term','options','disclosureType','frontBackFlag','hardSoftFlag','optionCode','optionDescription','optionOrigin','optionPrice','optionPricingType','price','optionPrice','optionPricingType','price','optionResidualAmount','residualTableAmount','residualTableFlag','satisfiedDate'))
注意使用min
而不是布尔列表来有效地实现逻辑AND而不是传递每个单独的标记名称测试结果。
您可以通过XPath断言进行各种其他抽样检查,但如果可能的话,请尝试使用#1中提到的架构一致性设施。
答案 1 :(得分:1)
下一个XPath将从optionPrice
:
/return/deal/options/optionPrice/*/local-name()