從WebService的SOAP返回數據中獲取子級的XML內容

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章