2013-05-05 126 views
1

我有以下代码:无法处理SOAP响应

SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance(); 
      SOAPConnection connection = sfc.createConnection(); 

      MessageFactory mf = MessageFactory.newInstance(); 
      SOAPMessage sm = mf.createMessage(); 
      SOAPHeader sh = sm.getSOAPHeader(); 
      SOAPBody sb = sm.getSOAPBody(); 
      sh.detachNode(); 
      MimeHeaders mimeHeader = sm.getMimeHeaders(); 

      //change header's attribute 
      mimeHeader.setHeader("SOAPAction", "\"urn:Belkin:service:basicevent:1#GetBinaryState\""); 
      //sh.addAttribute(SOAPFactory.newInstance().createName("SOAPAction", "", "urn:Belkin:service:basicevent:1#SetBinaryState"),""); 
      QName bodyName = new QName("urn:Belkin:service:basicevent:1", "GetBinaryState", "u"); 

      //sm.add    

      SOAPBodyElement bodyElement = sb.addBodyElement(bodyName); 
      QName qn = new QName("BinaryState"); 

      System.out.println("\n Soap Request:\n"); 
      sm.writeTo(System.out); 
      System.out.println(); 

      URL endpoint = new URL("http://" + ipAddress + ":49153/upnp/control/basicevent1"); 
      SOAPMessage response = connection.call(sm, endpoint); 

      connection.close(); 
      System.out.println(response.getContentDescription()); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

给我这样的反应(在Wireshark中)

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"      
    s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <s:Body> 
     <u:GetBinaryStateResponse xmlns:u="urn:Belkin:service:basicevent:1"> 
      <BinaryState>0</BinaryState> 
     </u:GetBinaryStateResponse> 
    </s:Body> 
</s:Envelope> 

我想要得到的BinaryState值(0)或(1 )在Java中。 我很难找出它在SOAPMessage响应中的位置。帮助会很好。或者即使我可以将XML响应放入一个字符串中并自己解析它。

回答

2

要转的SOAPMessage为String,那就是你有

SOAPMessage response = connection.call(sm, endpoint); 

这样做:

SOAPMessage response = connection.call(sm, endpoint); 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
response.writeTo(os); 
String responseXml = new String(os.toByteArray()); 
// work with responseXml here... 

编辑:

作为替代方案,如果你想要的是一个特定的值你已经知道这个名字的元素(至少有一个会存在),你可以通过这样的方式得到它:

String responseBinaryState = response.getSOAPBody() 
            .getElementsByTagName("BinaryState") 
            .item(0).getTextContent(); 
System.out.println("BinaryState: "+responseBinaryState); 
+0

美丽!非常感谢。一直拉着我的头发,谷歌没有帮助。 – Fidel 2013-05-05 23:08:14

+0

XML已被解析,为什么建议将其重新转换为String? – flup 2013-05-05 23:15:21

+0

@flup你说得对,我根据他提出的问题给出了'String'选项。我将添加一个替代方案,而不用转换成String。 – acdcjunior 2013-05-05 23:31:30

0

response.getSOAPBody()将给你一个身体的Dom节点,得到它的孩子将不会有任何不同于导航正常的Dom树。

所以,你可以通过树导航(未经测试,调试做!):

Node body = response.getSOAPBody(); 
Node binStateResponse = body.getFirstChild(); 
Node binaryState = binStateResponse.getFirstChild(); 
Node binaryStateText = binaryState.getFirstChild(); 
String result = binaryStateText.getNodeValue(); 

或使用XPath表达式来寻找答案有点更可靠,独立的机构的确切内容。

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
Node body = response.getSOAPBody(); 
String result = xpath.evaluate(
    "//BinaryState/text()", 
    body);