2013-12-09 18 views
10

Sto cercando di ottenere valori specifici dalla risposta ricevuta dal servizio web. Purtroppo non so come farlo. Ho usato il codice trovato su StackOverflow per la creazione di richiesta di sapone e la scrittura di contenuto della risposta in stdout:Richiesta di sapone Java - lettura della risposta del sapone

private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception { 
    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    Source sourceContent = soapResponse.getSOAPPart().getContent(); 
    System.out.print("\nResponse SOAP Message = "); 
    StreamResult result = new StreamResult(System.out); 
    transformer.transform(sourceContent, result); 
} 

Tutto funziona bene, ma ho bisogno di tutto il contenuto della risposta:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bin="http://localhost/WebService/bindings" xmlns:typ="http://localhost/WebService/types"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <bin:doActionResponse> 
     <bin:out> 
      <typ:result> 
       <typ:code>?</typ:code> 
       <typ:description>?</typ:description> 
      </typ:result> 
     </bin:out> 
     </bin:doActionResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Ho solo bisogno di valore del codice e descrizione da questa risposta. Come posso fare questo?

+0

dare un'occhiata a XPATH se si sta cercando di ottenere un singolo elemento da un messaggio soap http://stackoverflow.com/questions/2811001/how-to-read-xml-using-xpath-in-java –

+1

Credo che ci sia un modo per fare qualcosa di simile: 'soapResponse.getSOAPBody(). GetElementsByTagName()' ma continuo a ricevere alcuni strani valori mentre provo a fare questo. – J33nn

risposta

13

Ecco l'intero esempio di lavoro per qualche altro esempio xml;

public static void main(String[] args) throws IOException, SOAPException { 

    String xmlInput = " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://litwinconsulting.com/webservices/\">\n" 
      + " <soapenv:Header/>\n" 
      + " <soapenv:Body>\n" 
      + " <web:RES>\n" 
      + "  <web:RETURNCODE>100 </web:RETURNCODE> \n" 
      + " </web:RES>\n" 
      + "  <web:GetWeather>\n" 
      + "   <!--Optional:-->\n" 
      + "   <web:City>%CITY%</web:City>\n" 
      + "  </web:GetWeather>\n" 
      + " </soapenv:Body>\n" 
      + " </soapenv:Envelope>"; 

    MessageFactory factory = MessageFactory.newInstance(); 
    SOAPMessage message = factory.createMessage(
      new MimeHeaders(), 
      new ByteArrayInputStream(xmlInput.getBytes(Charset 
        .forName("UTF-8")))); 

    SOAPBody body = message.getSOAPBody(); 

    NodeList returnList = body.getElementsByTagName("web:RES"); 

    boolean isSuccess = false; 
    for (int k = 0; k < returnList.getLength(); k++) { 
     NodeList innerResultList = returnList.item(k).getChildNodes(); 
     for (int l = 0; l < innerResultList.getLength(); l++) { 
      if (innerResultList.item(l).getNodeName() 
        .equalsIgnoreCase("web:RETURNCODE")) { 
       isSuccess = Integer.valueOf(innerResultList.item(l) 
         .getTextContent().trim()) == 100 ? true : false; 
      } 
     } 
    } 
    if (isSuccess) { 
     NodeList list = body.getElementsByTagName("web:GetWeather"); 

     for (int i = 0; i < list.getLength(); i++) { 
      NodeList innerList = list.item(i).getChildNodes(); 

      for (int j = 0; j < innerList.getLength(); j++) { 
       System.out.println(innerList.item(j).getNodeName()); 
       System.out.println(innerList.item(j).getTextContent()); 
      } 
     } 
    } 

} 

e importazioni se necessario;

  • java.io.ByteArrayInputStream;
  • java.io.IOException;
  • java.nio.charset.Charset;
  • javax.xml.soap.MessageFactory;
  • javax.xml.soap.MimeHeaders;
  • javax.xml.soap.SOAPBody;
  • javax.xml.soap.SOAPException;
  • javax.xml.soap.SOAPMessage;
  • org.w3c.dom.NodeList;
+0

Questo metodo funziona, ma sta diventando molto lungo, c'è un modo per farlo usando xPath? @Una follia – ishanbakshi

0

Usa wsimport su .wsdl e genererà classi di servizio per te.

Problemi correlati