2013-12-09 137 views
10

我试图从我从webservice得到的响应中获取特定值。不幸的是我不知道该怎么做。我用计算器发现代码创建SOAP请求,并写出响应内容到标准输出:Java肥皂请求 - 阅读肥皂响应

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); 
} 

这一切运作良好,但我不需要整个响应内容:

<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> 

我只是需要的代码值以及这个回应的描述。我怎样才能做到这一点?

+0

看看XPATH如果你试图从肥皂消息中获取单个元素http://stackoverflow.com/questions/2811001/how-to-read-xml-using-xpath-in-java –

+1

我相信有一种方法可以做这样的事情:'soapResponse.getSOAPBody()。getElementsByTagName()',但我一直在尝试这样做时会遇到一些奇怪的值。 – J33nn

回答

13

这是一些其他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()); 
      } 
     } 
    } 

} 

如果您需要,可以导入;

  • 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

此方法有效,但它变得非常漫长,有没有一种方法可以通过使用xPath来实现? @NoBrainer – ishanbakshi

0

在.wsdl上使用wsimport,它会为您生成服务类。