Harshal
Harshal

Reputation: 1

xpath assertion in soapui not working

I am reach up to this using xpath- //ns1:GetAtomicWeightResponse/ns1:GetAtomicWeightResult[1] but how to reach upto AtomicWeight.

<NewDataSet>
  <Table>
    <AtomicWeight>12.0115</AtomicWeight>
  </Table>
</NewDataSet>

Here , I am not able to get value of AutomicWeight from table XML.

EDIT: Based on the comments from OP, adding the xml in the question.

<soap:Envelope
    xmlns:soap="schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="w3.org/2001/XMLSchema-instance"
    xmlns:xsd="w3.org/2001/XMLSchema">
    <soap:Body>
        <GetAtomicWeightResponse
            xmlns="webserviceX.NET">
            <GetAtomicWeightResult>
                <![CDATA[<NewDataSet><Table><AtomicWeight>12.0115</AtomicWeight></Table></NewDataSet>]]>
            </GetAtomicWeightResult>
        </GetAtomicWeightResponse>
    </soap:Body>
</soap:Envelope>

Upvotes: 0

Views: 550

Answers (2)

Rao
Rao

Reputation: 21379

Please use below xpath

//NewDataSet/Table/AtomicWeight

EDIT: Based on OP's data

Since, the data originally mentioned by you is in cdata that is why you were not able to get that value.

You can use below Groovy Script:

def xml = """<soap:Envelope xmlns:soap="schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema">
    <soap:Body>
        <GetAtomicWeightResponse xmlns="webserviceX.NET">
            <GetAtomicWeightResult><![CDATA[<NewDataSet><Table><AtomicWeight>12.0115</AtomicWeight></Table></NewDataSet>]]></GetAtomicWeightResult>
        </GetAtomicWeightResponse>
    </soap:Body>
</soap:Envelope>"""
def getData = { data, element -> new XmlSlurper().parseText(data).'**'.find{it.name() == element} }
def atomicWeight = getData((getData(xml, 'GetAtomicWeightResult') as String).trim(), 'AtomicWeight').text()
log.info atomicWeight

Or you can quickly try online Demo

If you are using it in SoapUI's test case, you do not have to add an additional Groovy Test step to get that value. Instead add the Script Assertion to the same request step (where you get that response) with below code(processing is same, but you do not have to use fixed xml, instead a dynamic response can be used).

Script Assertion

assert context.response, 'Response is empty or null'

def getData = { data, element -> new XmlSlurper().parseText(data).'**'.find{it.name() == element} }
def atomicWeight = getData((getData(context.response, 'GetAtomicWeightResult') as String).trim(), 'AtomicWeight').text()
log.info atomicWeight

Upvotes: 0

Neerajkumar
Neerajkumar

Reputation: 398

Consider Following response in your soap XML

   <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <ConversionRateResponse xmlns="http://www.webserviceX.NET/">
         <ConversionRateResult>1505.7</ConversionRateResult>
      </ConversionRateResponse>
   </soap:Body>
</soap:Envelope>

Xpath would be

declare namespace ns1='http://www.webserviceX.NET/';
//ns1:ConversionRateResponse[1]/ns1:ConversionRateResult[1]

Upvotes: 0

Related Questions