从XML中的SOAP调用拆分WebService响应?

时间:2014-01-21 21:33:54

标签: xml soap groovy

我有一个BPM Bonita项目,我通过SOAP调用调用web服务,显示的输出类似于:

    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
    <ns2:getBusinessDetailsResponse xmlns:ns2="http://bpm11.cs.unibo.it">
        <return>
        <name>Clinic Name</name>
        <type>clinic</type>
        <serviceLocation>http://localhost:8888/WebServices/Clinic1</serviceLocation>
        <serviceName>ClinicService</serviceName>
        <bankCode>IT02L1534555346128858689014</bankCode>
        <operatingAreaCodes>1</operatingAreaCodes>
        <operatingAreaCodes>2</operatingAreaCodes>
        <operatingAreaCodes>3</operatingAreaCodes>
        </return>
      </ns2:getBusinessDetailsResponse>
       </S:Body>
      </S:Envelope>

以Groovy代码中的唯一String传递给Bonita任务,这样:

import javax.xml.transform.dom.DOMSource;

def output = (DOMSource) response;
String currentTime = output.getNode().childNodes.item(0).textContent;

基本上变量currentTime返回完整的输出,但是没有任何分隔符......

例如:

Clinic Namecliniclocalhost:8888 ...etc.etc... IT02L1534555346128858689014123

而不是

Clinic Name, clinic, localhost:8888 ...etc.

是否可以拆分SOAP输出或添加分隔符?

非常感谢

1 个答案:

答案 0 :(得分:1)

好的,假设您正在获取DOMSource(来自某个地方),您可以这样做:

Map values = use( groovy.xml.dom.DOMCategory ) {
    output.node.childNodes.'**'.find { it.name() == 'return' }
                               .findAll { !it.name().startsWith( '#' ) }
                               .collectEntries { [ it.name(), it.text() ] }
}

为你提供地图:

['name':'Clinic Name',
 'type':'clinic',
 'serviceLocation':'http://localhost:8888/WebServices/Clinic1',
 'serviceName':'ClinicService',
 'bankCode':'IT02L1534555346128858689014',
 'operatingAreaCodes':'3']

但是,如果您可以以字符串形式访问XML,那么使用XmlSlurper这样就更好了:

Map slurpedValues = new XmlSlurper().parseText( xml ).with { x ->
    x.Body.getBusinessDetailsResponse.return
                                     .children()
                                     .collectEntries { [ it.name(), it.text() ] }
}

哪个结果相同