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()
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.