如何通过soapui检索正确的xml节点

时间:2017-02-09 06:49:17

标签: xml groovy soapui

我有一个xml,我希望从HotelOption节点推出'RatePlanCode',但诀窍是在HotelOption节点内需要HotelSupplement'代码”。如果当时有HotelSupplement'代码',我们不会为该酒店采用'RatePlanCode',只会采用那些酒店。我的问题是如何执行此检查以便它取出正确的'RatePlanCode'?

下面是一个xml示例,您可以在其中看到第一个HotelOption之间没有HotelSupplement'代码',因此我们不会使用该酒店的'RatePlanCode'而是第二个HotelOption确实有HotelSupplement'代码'所以我们采用'RatePlanCode'。

<soap:Envelope>
   <soap:Body>
      <HotelAvailResponse>
         <AvailabilityRS TimeStamp="2017-02-08T17:07:17.3372275+00:00" IntCode="TLqw0EfFwMZFNlFLjsETG67d66mZhioSdJ4oCcM1Hao=">
            <Results>
               <HotelResult>
                  <HotelOptions>
                     <HotelOption RatePlanCode="xxxxxxxrEsM=" Status="OK" NonRefundable="false">
                        <AdditionalElements>
                           <HotelOffers>
                              <HotelOffer>
                                 <Description></Description>
                              </HotelOffer>
                           </HotelOffers>
                        </AdditionalElements>
                     </HotelOption>
                     <HotelOption RatePlanCode="xxxxxxxxxxGQjs=" Status="OK" NonRefundable="false">
                        <AdditionalElements>
                           <HotelSupplements>
                              <HotelSupplement Code="202964">
                                 <Name>Bed&amp;Breakfast</Name>
                              </HotelSupplement>
                           </HotelSupplements>
                           <HotelOffers>
                              <HotelOffer>
                                 <Description></Description>
                              </HotelOffer>
                           </HotelOffers>
                        </AdditionalElements>
                     </HotelOption>
                  </HotelOptions>
               </HotelResult>
            </Results>
         </AvailabilityRS>
      </HotelAvailResponse>
   </soap:Body>
</soap:Envelope>

下面是一个有效的静态版本,但它需要是动态的,这样如果在另一个例子中有更多酒店,我们会采用一个符合我们标准的RatePlanCode。此代码存储在属性中。

import groovy.xml.XmlUtil
def response = testRunner.testCase.getTestStepByName("GetHotelAvailability").getProperty("Response").getValue();
def xml = new XmlParser().parseText( response )

def RatePlanCode = xml.'soap:Body'.HotelAvailResponse[0].AvailabilityRS[0].Results[0].HotelResult[0].HotelOptions[0].HotelOption[1].@RatePlanCode

testRunner.testCase.setPropertyValue('RatePlanCode', RatePlanCode)

谢谢

1 个答案:

答案 0 :(得分:0)

这是groovy脚本:

  • 该脚本从名为“GetHotelAvailability”的步骤中读取响应。
  • 查找每个HotelOption,并检查是否有名为“HotelSupplement”的元素,并且它具有属性“Code”并获取RatePlanCode
  • “RatePlanCode”的结果是列表 - 它可能有零个或多个“RatePlanCode”。
  • 如果列表中未找到费率计划代码,则会抛出断言错误。否则,选择第一个元素作为“RatePlancde”并分配到测试用例级自定义属性“RatePlanCode”。
def response = testRunner.testCase.getTestStepByName("GetHotelAvailability").getProperty("Response").getValue()

def parsedxml = new XmlSlurper().parseText(response)
//Get the HotelOptions
def hOptions = parsedxml.'**'.findAll { it.name() == 'HotelOption'}
//Get the rate plan codes
def getRatePlanCode = { option ->
    def res = option.'**'.findAll {it.name() == 'HotelSupplement' && it.@Code} 
    if (res)  return option.@RatePlanCode.text()   
    null
}

def planCodes = []
hOptions.each { if (getRatePlanCode(it)) planCodes << getRatePlanCode(it) }
log.info " plan codes : ${planCodes}"
//if no plan codes, then throw error
assert planCodes.size(), "No RatePlanCode present in the response"

//Assing rate plan code to test case custom property
context.testCase.setPropertyValue('RatePlanCode', planCodes[0].toString())