Search code examples
xmlgroovysoapuixmlslurper

Groovy to get node values from XML in SoapUI response


I try to get node values from XML response in a Groovy script in SoapUI. XML file sample:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:validateSignatureResponse xmlns:ns2="http://validation.dss.esig.europa.eu/" xmlns:ns3="http://dss.esig.europa.eu/validation/diagnostic" xmlns:ns4="http://dss.esig.europa.eu/validation/simple-report" xmlns:ns5="http://dss.esig.europa.eu/validation/detailed-report">
         <WSReportsDTO>
            <ns3:diagnosticData>
               <ns3:DocumentName>testSigned.pdf</ns3:DocumentName>
               <ns3:ValidationDate>2019-08-08T09:54:34</ns3:ValidationDate>
               <ns3:Signatures>
                  <ns3:Signature Id="id-547ee2a04f4daf63g7e8g784b9920188719ca1f589e514egeg4573c1d1e0ea697b">
                     <ns3:SignatureFilename>testSigned.pdf</ns3:SignatureFilename>
                     <ns3:DateTime>2017-07-05T14:34:34</ns3:DateTime>
                     <ns3:SignatureFormat>PAdES-BASELINE-T</ns3:SignatureFormat>
                     <ns3:StructuralValidation>
                        <ns3:Valid>true</ns3:Valid>
                     </ns3:StructuralValidation>

I tried to use XmlSlurper, as shown below:

def slurped = new XmlSlurper().parseText(response);
def status = ${slurped.'ns3:diagnosticData'.'ns3:Signatures'.'ns3:StructuralValidation'.'ns3:Valid'};

I got error message:

groovy.lang.MissingMethodException: No signature of method: Script23.$() is applicable for argument types: (Script23$_run_closure1) values: [Script23$_run_closure1@1e6835] Possible solutions: is(java.lang.Object), run(), run(), any(), use([Ljava.lang.Object;), any(groovy.lang.Closure) error at line: 13

After that I tried with this code and didn't get any error message, but property value is empty after execution.

def slurped = new XmlSlurper().parseText(response);
def indication = slurped.diagnosticData.Signatures.StructuralValidation.Valid;

I tried the same also in different form:

def code = new XmlSlurper().parseText(xml)
                           .Body
                           .validateSignatureResponse
                           .WSReportsDTO
                           .diagnosticData
                           .Signatures
                           .Signature
                           .StructuralValidation
                           .Valid
                           .text()

Solution

  • You could use GPath, Groovy's equivalent of XPath, to go straight to your element rather than navigating down the hierarchy:

    def response = '''
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
            <ns2:validateSignatureResponse xmlns:ns2="http://validation.dss.esig.europa.eu/" xmlns:ns3="http://dss.esig.europa.eu/validation/diagnostic" xmlns:ns4="http://dss.esig.europa.eu/validation/simple-report" xmlns:ns5="http://dss.esig.europa.eu/validation/detailed-report">
                <WSReportsDTO>
                    <ns3:diagnosticData>
                        <ns3:DocumentName>testSigned.pdf</ns3:DocumentName>
                        <ns3:ValidationDate>2019-08-08T09:54:34</ns3:ValidationDate>
                        <ns3:Signatures>
                            <ns3:Signature Id="id-547ee2a04f4daf63g7e8g784b9920188719ca1f589e514egeg4573c1d1e0ea697b">
                                <ns3:SignatureFilename>testSigned.pdf</ns3:SignatureFilename>
                                <ns3:DateTime>2017-07-05T14:34:34</ns3:DateTime>
                                <ns3:SignatureFormat>PAdES-BASELINE-T</ns3:SignatureFormat>
                                <ns3:StructuralValidation>
                                    <ns3:Valid>true</ns3:Valid>
                                </ns3:StructuralValidation>
                            </ns3:Signature>
                        </ns3:Signatures>
                    </ns3:diagnosticData>
                </WSReportsDTO>
            </ns2:validateSignatureResponse>
        </soap:Body>
    </soap:Envelope>
    '''
    
    def parsedXML = new XmlSlurper().parseText(response)
    def status = parsedXML.'**'.findAll { it.name() == 'Valid' }
    println(status)
    

    See Groovy Goodness: Navigating with GPath for a gentle introduction.