且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在soapui groovy脚本中从xml获取文本值

更新时间:2023-12-05 17:03:04

如果要在标签messageText中提取文本,则可以指定父节点和子节点,即修改您的最后一行

  def byteResponse = holder.getNodeValue(// *:operationStatus // *:messageText)

//由于在整个响应中只有一个名为messageText的标记,您可以使用这个

def byteResponse = holder.getNodeValue(// *:messageText )


My task is get value from xml in soapui to create next test in a sequence.

I use groovy script

My target is get text inside tag. It's easy to recognize becouse it's base64 encoded string.

def project = testRunner.testCase.testSuite.project ;
def tcase = project.testSuites["ChangeRetentionByCopyDemoSuite"].testCases["Milestone2"] ; 
def tstep = tcase.getTestStepByName("getDocuments - GetContentURLRequest");

def responseTestSuite1 = tstep.getPropertyValue("response");

log.info(responseTestSuite1.toString());

def gutils = new com.eviware.soapui.support.GroovyUtils( context );
def holder = gutils.getXmlHolder("$responseTestSuite1");

def byteResponse = holder.getNodeValue("/S:Envelope/S:Body/g:getDocumentsResponse/text()");

log.info(byteResponse);

The xml responce in getDocuments - GetContentURLRequest

    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Header>
      <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <Created>2015-09-15T13:57:50.844Z</Created>
            <Expires>2015-09-16T13:57:50.844Z</Expires>
         </Timestamp>
      </Security>
   </S:Header>
   <S:Body>
      <getDocumentsResponse xmlns="http://asg.com/2009/03/schemas/tciadapters/getdocument">
         <result>
            <operationStatus>
               <severity>INFO</severity>
               <reasonCode>A300</reasonCode>
               <messageText>All requests completed without errors.</messageText>
            </operationStatus>
            <documents>
               <DocumentData>
                  <docId>
                     <NameValuePair>
                        <keyName>cmis:objectId</keyName>
                        <keyValue>idd_48716F01-F5F7-4702-AC80-4EC70C949121</keyValue>
                     </NameValuePair>
                  </docId>
                  <status xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
                  <content>
                     <ContentSegment>
                        <data>aHR0cHM6Ly91c3J5ZTh0Y2k0bTAyLmFzZy5jb206NzQ0My9jbWlzYWRhcHRlci9nZXRjb250ZW50P3VzZXJpZD1kZXY2ZGV2aWQmcGFzc3dvcmQ9ZGV2ZWxvcCUyMzEmY21pc19pbnN0YW5jZT1GaWxlTmV0UDgrLStBdG9tUHViJnJlcG9zaXRvcnk9ZmlsZW5ldG9iamVjdHN0b3JlMSZjbWlzOm9iamVjdElkPWlkZF80ODcxNkYwMS1GNUY3LTQ3MDItQUM4MC00RUM3MEM5NDkxMjE=</data>
                     </ContentSegment>
                  </content>
                  <metadata/>
                  <properties>
                     <subrange xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
                     <format xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
                     <supportedFormats/>
                  </properties>
                  <retention/>
               </DocumentData>
            </documents>
         </result>
      </getDocumentsResponse>
   </S:Body>
</S:Envelope>

Unfortunately I got exception when run last line of code

If you want to extract text inside the tag "messageText" then, you could specify the parent node and the child node, i.e., modify your last line to

def byteResponse = holder.getNodeValue("//*:operationStatus//*:messageText")

// since there is only one tag named "messageText" in the entire response, you could use this also

def byteResponse = holder.getNodeValue("//*:messageText")