1

次のコードがあります。

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>

BinaryStateJavaで値(0)または(1)を取得したい。SOAPMessageこれが応答のどこにあるかを把握するのに苦労しています。助けは素晴らしいでしょう。または、XML 応答を文字列に入れて自分で解析できたとしても。

4

2 に答える 2

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);
于 2013-05-05T23:17:28.123 に答える