我有以下代码:
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>
我希望在Java中获得BinaryState
值(0)或(1)。
我很难找出SOAPMessage
响应中的位置。帮助会很棒。或者即使我可以将XML响应放在一个字符串中并自己解析它。
答案 0 :(得分: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);
答案 1 :(得分: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);