在webservice調用的返回值中,爲了傳輸方便,一般只有一個返回值.這返回值往往是xml或者json格式. 如果用java httpclient方式調用的話, 返回值將是完整的SOAP XML數據返回.如果想獲取其中包含的真正的返回值,還需要解析這個xml, 然鵝....在用java自有的xml解析功能時, 在獲取body節點(Element/Node)之後, 再獲取body的內容時, 只能獲取Text內容,並不包含子xml的標籤.爲解決這個問題我們需要使用到jdom這個jar包.下面舉例說明獲取xml內容的方式.
下載jdom(JDOM) 或者直接構建maven項目:
<!-- https://mvnrepository.com/artifact/jdom/jdom --> <dependency> <groupId>jdom</groupId> <artifactId>jdom</artifactId> <version>1.0</version> </dependency>
假如SOAP 返回值:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> <soapenv:Body> <root> <code>0</code> <message></message> <students> <student> <name>李二狗</name> <classroom>三班</classroom> <age>198</age> <sex>男</sex> </student> <student> <name>王丫蛋</name> <classroom>四(3)班</classroom> <age>19</age> <sex>女</sex> </student> </students> </root> </soapenv:Body> </soapenv:Envelope>
我們的目的是讀取<ns:Body>內的root節點的所有xml內容如下:
解析的代碼:
import java.io.ByteArrayOutputStream; import java.io.StringReader; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; import org.junit.jupiter.api.Test; class PenguinTest { @Test void test() { String soapresp = ""; soapresp = "<soapenv:Envelope xmlns:soapenv=\"http://www.w3.org/2003/05/soap-envelope\">\r\n" + " <soapenv:Body>\r\n" + " <root>\r\n" + " <code>0</code>\r\n" + " <message></message>\r\n" + " <students>\r\n" + " <student>\r\n" + " <name>李二狗</name>\r\n" + " <classroom>三班</classroom>\r\n" + " <age>198</age>\r\n" + " <sex>男</sex>\r\n" + " </student>\r\n" + " <student>\r\n" + " <name>王丫蛋</name>\r\n" + " <classroom>四(3)班</classroom>\r\n" + " <age>19</age>\r\n" + " <sex>女</sex>\r\n" + " </student>\r\n" + " </students>\r\n" + " </root>\r\n" + " </soapenv:Body>\r\n" + "</soapenv:Envelope>"; SAXBuilder saxBuilder = new SAXBuilder(); StringReader reader = new StringReader(soapresp); Document build = null; try { build = saxBuilder.build(reader); // 讀取root節點 Element body = (Element) build.getRootElement().getChildren().get(0); // ns:Body Element root = (Element) body.getChildren().get(0); // Element 轉 XML String XMLOutputter xmlout = new XMLOutputter(); ByteArrayOutputStream bo = new ByteArrayOutputStream(); xmlout.output(root, bo); // 把Element 寫入 ByteArrayOutputStream 中 String rootXml = bo.toString(); bo.close(); System.out.println(rootXml); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
得到的結果如下:
<root> <code>0</code> <message /> <students> <student> <name>李二狗</name> <classroom>三班</classroom> <age>198</age> <sex>男</sex> </student> <student> <name>王丫蛋</name> <classroom>四(3)班</classroom> <age>19</age> <sex>女</sex> </student> </students> </root>