2012-08-03 5 views
1

SOAP 응답이 다음과 같습니다.조건부 XML 노드 읽기 Groovy

nIdType = "ACTIVE"인 주소와 nId를 선택해야합니다.

더 많은 주소와 nId가있을 수 있으며 첫 번째 일치 항목을 선택해야합니다.

는 내가 새로운 오전으로 어떤 성공을 도와 호야 가지고 그루비 스크립트를 작성하지

모든 주소 또는 NID

내가 필요한 테스트 속성이이 mayn't 수 가능성이있을 수 있습니다 내가

<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
당신은이 작업을 수행 할 수

ㅁ 그루비 스크립트를 통해 구현해야 모두 주소 및 NID

를 업데이트 (I는 폐쇄을 추가했다 </SOAP-ENV:Envelope> 당신의 XML에 태그 </ns2:Address></ns2:macAddress> 변경은 유효한 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

+0

@ user1574409 예, 당신은 abl이어야합니다 e to ('response'는 유효한 XML을 포함하는 문자열이라고 가정). 작업 예제를 위해 하드 코딩했습니다. –

+0

Tim에 감사드립니다. nIdType == "ACTIVE"를 수행하는 모든 활성 주소를 인쇄하려면 requiremnet에서 최상위 작업을 수행하고 내 요구 사항을 충족하십시오. 나는 모두 대신 findall을 할 것이고 모든 루프를 인쇄하는 방법이나 다른 어떤 방법이있을 것입니다. – user1574409