2012-08-03 96 views
1

我有以下SOAP响应:阅读条件XML节点Groovy

我需要选择地址和nId有nIdType =“ACTIVE”。

可能会有更多的地址和nId,我需要选择第一场比赛。

我写Groovy脚本,并没有得到任何的成功。请帮我,我新

可能有可能所有的地址可能会或那下跪具有NID

我有试验性质,我需要同时更新地址和NID

我需要通过Groovy脚本来实现WH

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <ns2:GetD xmlns:ns2="http://xyxz/pqr" xmlns:ns3="http://pqp/ptr" xmlns:ns4="http://nhgg./ns"> 
      <ns2:du> 
       <ns2:Address>UUUUUU</ns2:macAddress> 
      </ns2:du> 
      <ns2:du> 
       <ns2:Address>XXXXXXX</ns2:macAddress> 
      </ns2:du> 
      <ns2:du> 
       <ns2:Address>PQWWEEE</ns2:macAddress> 
      <ns2:dP> 
       <ns2:pN>1</ns2:pN> 
       <ns2:sE> 
        <ns2:nId>08767727</ns2:nId> 
        <ns2:nIdType>ACTIVE</ns2:nIdType> 
       <ns2:sE> 
      </ns2:dP> 
      </ns2:du> 
      <ns2:du> 
       <ns2:Address>TTTTTTTT</ns2:macAddress> 
      </ns2:du> 
     </ns2:GetD> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

回答

2

你可以这样做(我不得不添加结束</SOAP-ENV:Envelope>标记您的XML和改变</ns2:macAddress></ns2:Address>,使其有效的XML)

def xml = '''<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
      | <SOAP-ENV:Header/> 
      | <SOAP-ENV:Body> 
      | <ns2:GetD xmlns:ns2="http://xyxz/pqr" xmlns:ns3="http://pqp/ptr" xmlns:ns4="http://nhgg./ns"> 
      |  <ns2:du> 
      |  <ns2:Address>UUUUUU</ns2:Address> 
      |  </ns2:du> 
      |  <ns2:du> 
      |  <ns2:Address>XXXXXXX</ns2:Address> 
      |  </ns2:du> 
      |  <ns2:du> 
      |  <ns2:Address>PQWWEEE</ns2:Address> 
      |  <ns2:dP> 
      |   <ns2:pN>1</ns2:pN> 
      |   <ns2:sE> 
      |   <ns2:nId>08767727</ns2:nId> 
      |   <ns2:nIdType>ACTIVE</ns2:nIdType> 
      |   </ns2:sE> 
      |  </ns2:dP> 
      |  </ns2:du> 
      |  <ns2:du> 
      |  <ns2:Address>TTTTTTTT</ns2:Address> 
      |  </ns2:du> 
      | </ns2:GetD> 
      | </SOAP-ENV:Body> 
      |</SOAP-ENV:Envelope>'''.stripMargin() 

def a = new XmlSlurper().parseText(xml).Body?.GetD?.du?.find { node -> 
    node.dP?.sE?.nIdType.text() == 'ACTIVE' 
} 

println "First Active Address = ${a?.Address?.text()}" 

,打印:

First Active Address = PQWWEEE 

但很难从你的问题告诉你到底是什么

+0

后非常感谢..我无法硬编码XML,因为这个响应来自于我在大自然中动态的服务.. def response = context.expand('$ {getD#Response}')我可以使用响应而不是你的xml变量 – user1574409 2012-08-03 15:12:37

+0

@ user1574409是的,你应该是abl e(假设'response'是一个包含有效XML的字符串)。我只是为了一个工作示例对它进行了硬编码 – 2012-08-03 15:23:59

+0

感谢Tim ..它工作并满足我的要求。如果我想打印所有具有nIdType ==“ACTIVE”的活动地址,则需要在requiremnet上执行什么操作。我需要做findall而不是所有的,以及如何打印所有循环或其他技术是否存在 – user1574409 2012-08-03 17:59:49