axis2發布webservice和客戶端調用的例子,完全可以跑的通 ,這里在services.xml中發布多個服務


axis2發布webservice和客戶端調用的例子,完全可以跑的通 ,這里在services.xml中發布多個服務

這里模仿中國移動webservice的實際調用過程

 采用Axis2發布webservice,采用手動生成.aar文件,手動生成webservice的客戶端代碼

 這次的webservice代碼還是在webServiceServerDemo項目中

Webservice的服務端的代碼

package com.dongaiqin.wanggd;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import webServiceServerDemo.RequestInfo;
import webServiceServerDemo.QueryPersonInfoRequest;

/**
 * 入參報文如下:
 * <?xml version="1.0" encoding="GBK" standalone="no" ?>
    <ROOT>
        <REQUEST_INFO>
            <IDCARD_NO type="string">370982</IDCARD_NO>
            <PERSON_NAME type="string">WANGGD</PERSON_NAME>
        </REQUEST_INFO>
    </ROOT>
 * @author Administrator
 *
 */

public class WebServiceServerDemo{
    public String callService(String requstXml)  {
        //入參數是xml格式,返回值也是xml的
        //解析入參
        String IDCARD_NO ="";
        String PERSON_NAME="";
        String REQUEST_INFO="";
        Document document;
        try {
            document = DocumentHelper.parseText(requstXml);
            Element root = document.getRootElement();
            //注意dom4j解析xml時,獲取的element不能越級的節點  ,如是不能直接通過root根節點,
            //來查找非直接子節點的元素,如這里的IDCARD_NO
            IDCARD_NO = root.element("REQUEST_INFO").element("IDCARD_NO").getText();
            PERSON_NAME = root.element("REQUEST_INFO").element("PERSON_NAME").getText();
            /*List list = root.elements("REQUEST_INFO");
            Element element = (Element)list.get(0);
            System.out.println(element.element("IDCARD_NO").getText());*/
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(IDCARD_NO);
        System.out.println(PERSON_NAME);
        //這里沒有查詢數據庫,直接返回一段數據
        if(IDCARD_NO.equals("370982")&&PERSON_NAME.equals("WANGGD")){
            System.out.println("****************************");
            return "<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\" ?> \n"+
            "<ROOT> \n"+
            "<IDCARD_NO type=\"string\">370982</IDCARD_NO> \n"+
            "<PERSON_NAME type=\"string\">WANGGD</PERSON_NAME> \n"+
            "<PERSON_AGE type=\"string\">30</PERSON_AGE> \n"+
            "<PERSON_ADDRESS type=\"string\">濟南市中區</PERSON_ADDRESS> \n"+
            "<PERSON_INFO> \n"+
                "<COURCE_LIST>\n"+
                    "<COURSE>\n"+
                        "<COURCE_NAME type=\"string\">英語</COURCE>\n"+
                        "<COURCE_SCORE type=\"string\">120</COURCE>\n"+
                    "</COURSE>\n"+
                    "<COURSE>\n"+
                    "<COURCE_NAME type=\"string\">數學</COURCE>\n"+
                    "<COURCE_SCORE type=\"string\">150</COURCE>\n"+
                "</COURSE>\n"+
                "</COURCE_LIST>\n"+
                
                "<HOBBYS_LIST>\n"+
                    "<HOBBY>\n"+
                        "<HOBBY_NAME type=\"string\">足球</HOBBY>\n"+
                        "<HOBBY_TIME type=\"string\">2年</HOBBY>\n"+
                    "</HOBBY>\n"+
                    "<HOBBY>\n"+
                        "<HOBBY_NAME type=\"string\">魔術</HOBBY>\n"+
                        "<HOBBY_TIME type=\"string\">2年</HOBBY>\n"+
                    "</HOBBY>\n"+            
                "</HOBBYS_LIST>\n"+    
            "</PERSON_INFO>\n"+
        "</ROOT>\n";
        }else {
            return null;
        }
    }
    public static void main(String[] args) {
        RequestInfo requestInfo = new RequestInfo();
        requestInfo.setIdCardNo("370982");
        requestInfo.setPersonName("WANGGD");
        QueryPersonInfoRequest request = new QueryPersonInfoRequest();
        request.setRequestInfo(requestInfo);
        System.out.println(MyParseXml.parseTestWebserviceRequest2XML(request));
        System.out.println(new WebServiceServerDemo().callService(MyParseXml.parseTestWebserviceRequest2XML(request)));
    }
}
View Code

項目的組織結構,這次同時發布2個服務

其中deploy文件夾中,

除了META-INF使用文件夾以外,其他的可以使用package,   deploy  下面保存的都是要發布的webservice服務相關的class文件

 

 

注意這里的services.xml的內容 ,

此處使用<serviceGroup> </serviceGroup> 來發布多個服務,

每個服務采用<service></service> 來聲明

<serviceGroup>

     <service name="ManagerUserService">

         <description>ManagerUserService</description>

         <parameter name="ServiceClass">com.hoo.service.ManagerUserService

         </parameter>

         <messageReceivers>

              <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"

                   class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />

              <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"

                   class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

         </messageReceivers>

     </service>

     <service name="WebServiceServerDemo">

         <description>WebServiceServerDemo</description>

         <parameter name="ServiceClass">com.dongaiqin.wanggd.WebServiceServerDemo

         </parameter>

         <messageReceivers>

              <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"

                   class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />

              <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"

                   class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

         </messageReceivers>

     </service>

</serviceGroup>

 手動生成aar文件

1. 在cmd中進入到webServiceServerDemo項目中deploy文件夾下面

(deploy中存放了發布webservice相關的class文件和services.xml配置文件)

刷新deploy文件夾后會看到生成的aar文件

把剛生成的webSeviceDemo.aar放到tomcat 的webapps\axis2\WEB-INF\services

啟動tomcat,看一下效果,可以發現在services.xml中發布的2個服務

新建web工程。webserviceClientDemo 用來統一存放生成的webservice的客戶端

webserviceClientDemo 項目中要添加axis2的支持

在cmd中進入到webserviceClientDemo項目所在的空間的路徑,執行命令

wsdl2java -uri http://localhost:8080/axis2/services/WebServiceServerDemo?wsdl

執行wsdl2java -uri  http://localhost:8080/axis2/services/ManagerUserService?wsdl

生成ManagerUserService對應的客戶端代碼

刷新webserviceClientDemo項目可以看到生成的客戶端代碼

下面封裝webservice的報文信息
---------------------------------------------------------------------------------------------------------------------------------
服務名: queryPersonInfo
說明:根據   客戶的身份證前6位 和 客戶的用戶名   查詢用戶 的相關信息,如選課的信息和愛好信息
---------------------------------------------------------------------------------------------------------------------------------
入參報文如下:
  <?xml version="1.0" encoding="GBK" standalone="no" ?>
    <ROOT>
        <REQUEST_INFO>
            <IDCARD_NO type="string">370982</IDCARD_NO>
            <PERSON_NAME type="string">WANGGD</PERSON_NAME>
        </REQUEST_INFO>
</ROOT>


出參報文如下:

<?xml version="1.0" encoding="GBK" standalone="no" ?>
<ROOT>
    <IDCARD_NO type="string">370982</IDCARD_NO>
    <PERSON_NAME type="string">WANGGD</PERSON_NAME>
    <PERSON_AGE type="string">30</PERSON_AGE>
    <PERSON_ADDRESS type="string">濟南市中區</PERSON_ADDRESS>
    <PERSON_INFO>
        <COURCE_LIST>
            <COURSE>
                <COURCE_NAME type="string">英語</COURCE>
                <COURCE_SCORE type="string">120</COURCE>
            </COURCE>
            <COURSE>
                <COURCE_NAME type="string">數學</COURCE>
                <COURCE_SCORE type="string">150</COURCE>
            </COURCE>
        </COURCE_LIST>
        
        <HOBBYS_LIST>
            <HOBBY>
                <HOBBY_NAME type="string">足球</HOBBY>
                <HOBBY_TIME type="string">2年</HOBBY>
            </HOBBY>
            <HOBBY>
                <HOBBY_NAME type="string">魔術</HOBBY>
                <HOBBY_TIME type="string">2年</HOBBY>
            </HOBBYS>
        </HOBBYS_LIST>    
    </PERSON_INFO>
</ROOT>



第一步: 根據給定的報文,封裝報文

1.    封裝入參報文
<?xml version="1.0" encoding="GBK" standalone="no" ?>
    <ROOT>
        <REQUEST_INFO>
            <IDCARD_NO type="string">370982</IDCARD_NO>
            <PERSON_NAME type="string">WANGGD</PERSON_NAME>
        </REQUEST_INFO>
</ROOT>

這里把
<IDCARD_NO type="string">370982</IDCARD_NO>
<PERSON_NAME type="string">WANGGD</PERSON_NAME>
封裝到一個對象里面,
IDCARD_NO和 PERSON_NAME 分別對應對象的兩個屬性
private String idCardNo ="";  //默認值為空字符 
private String personName ="";

代碼如下:
package com.dongaiqin.objects;

public class RequestInfo {

    private String idCardNo ="";  //默認值為空字符 
    private String personName ="";

    public String getIdCardNo() {
        return idCardNo;
    }

    public void setIdCardNo(String idCardNo) {
        this.idCardNo = idCardNo;
    }

    public String getPersonName() {
        return personName;
    }

    public void setPersonName(String personName) {
        this.personName = personName;
    }

    public RequestInfo(String idCardNo, String personName) {
        super();
        this.idCardNo = idCardNo;
        this.personName = personName;
    }

    public RequestInfo() {
        super();
    }

}
 


<REQUEST_INFO></REQUEST_INFO>標簽對中整個內容封裝為一個對象,該對象中包含又有一個對象(RequestInfo)

package com.dongaiqin.objects;

/**
 * 入參報文:
 * 
 * 入參報文如下:
 * <?xml version="1.0" encoding="GBK" standalone="no" ?>
    <ROOT>
        <REQUEST_INFO>
            <IDCARD_NO type="string">370982</IDCARD_NO>
            <PERSON_NAME type="string">WANGGD</PERSON_NAME>
        </REQUEST_INFO>
    </ROOT>
 * 
 * @author Administrator
 *
 */
public class QueryPersonInfoRequest {

    /**
     * 這里把下面的東西封裝為一個對象RequestInfo,對象有2個屬性
     * <REQUEST_INFO>
            <IDCARD_NO type="string">370982</IDCARD_NO>
            <PERSON_NAME type="string">WANGGD</PERSON_NAME>
        </REQUEST_INFO>
     */
    
    
    private RequestInfo requestInfo;

    public RequestInfo getRequestInfo() {
        return requestInfo;
    }

    public void setRequestInfo(RequestInfo requestInfo) {
        this.requestInfo = requestInfo;
    }

    public QueryPersonInfoRequest(RequestInfo requestInfo) {
        super();
        this.requestInfo = requestInfo;
    }

    public QueryPersonInfoRequest() {
        super();
    }
    
}
 
2.    封裝出參報文信息: 

 這一次把所有的出參報文信息封裝為一個對象QueryPersonInfoResponse

<IDCARD_NO type="string">370982</IDCARD_NO>
<PERSON_NAME type="string">WANGGD</PERSON_NAME>
<PERSON_AGE type="string">30</PERSON_AGE>
<PERSON_ADDRESS type="string">濟南市市中區</PERSON_ADDRESS>

封裝為 對象的屬性
private String idCardNO;
private String personName;
private String personAge;
private String personAddress;

報文:
<COURCE_LIST>
    <COURSE>
        <COURCE_NAME type="string">英語</COURCE>
        <COURCE_SCORE type="string">120</COURCE>
    </COURCE>
    <COURSE>
        <COURCE_NAME type="string">數學</COURCE>
        <COURCE_SCORE type="string">150</COURCE>
    </COURCE>
</COURCE_LIST>

其中
<COURSE>
    <COURCE_NAME type="string">英語</COURCE>
    <COURCE_SCORE type="string">120</COURCE>
</COURCE>

封裝為一個對象Cource
package com.dongaiqin.objects; 
/**
 * 封裝
 * <COURSE>
        <COURCE_NAME type="string">英語</COURCE>
        <COURCE_SCORE type="string">120</COURCE>
  </COURCE>
  <COURSE>
        <COURCE_NAME type="string">數學</COURCE>
        <COURCE_SCORE type="string">150</COURCE>
  </COURCE>
 * 
 * @author Administrator
 *
 */
public class Cource {

    private String courceName;
    private String courceScore;
    public String getCourceName() {
        return courceName;
    }
    public void setCourceName(String courceName) {
        this.courceName = courceName;
    }
    public String getCourceScore() {
        return courceScore;
    }
    public void setCourceScore(String courceScore) {
        this.courceScore = courceScore;
    }
    public Cource(String courceName, String courceScore) {
        super();
        this.courceName = courceName;
        this.courceScore = courceScore;
    }
    public Cource() {
        super();
    }
}
 
<COURCE_LIST></COURCE_LIST> 整個標簽對 的內容,封裝為一個list

private List<Cource> courceList =new ArrayList<Cource>(); 

報文:
<HOBBYS_LIST>
    <HOBBY>
        <HOBBY_NAME type="string">足球</HOBBY>
        <HOBBY_TIME type="string">2年</HOBBY>
    </HOBBY>
    <HOBBY>
        <HOBBY_NAME type="string">魔術</HOBBY>
        <HOBBY_TIME type="string">2年</HOBBY>
    </HOBBYS>
</HOBBYS_LIST>     

下面的報文
<HOBBY>
    <HOBBY_NAME type="string">足球</HOBBY>
    <HOBBY_TIME type="string">2年</HOBBY>
</HOBBY>
封裝為一個對象Hobby 
package com.dongaiqin.objects;
/**
 * 封裝
 * <HOBBY>
        <HOBBY_NAME type="string">足球</HOBBY>
        <HOBBY_TIME type="string">2年</HOBBY>
    </HOBBY>
    <HOBBY>
        <HOBBY_NAME type="string">魔術</HOBBY>
        <HOBBY_TIME type="string">2年</HOBBY>
    </HOBBYS>
 * @author Administrator
 *
 */
public class Hobby {
  
    private String hobbyName;
    private String hobbyTime;
    public String getHobbyName() {
        return hobbyName;
    }
    public void setHobbyName(String hobbyName) {
        this.hobbyName = hobbyName;
    }
    public String getHobbyTime() {
        return hobbyTime;
    }
    public void setHobbyTime(String hobbyTime) {
        this.hobbyTime = hobbyTime;
    }
    public Hobby(String hobbyName, String hobbyTime) {
        super();
        this.hobbyName = hobbyName;
        this.hobbyTime = hobbyTime;
    }
    public Hobby() {
        super();
    }
}
 

<HOBBYS_LIST></HOBBYS_LIST>整個標簽對的內容封裝為一個list

private List<Hobby> hobbyList =new ArrayList<Hobby>();

此時出參報文信息封裝完畢,封裝為QueryPersonInfoResponse 


package com.dongaiqin.objects;

import java.util.ArrayList;
import java.util.List;

/**
 * <?xml version="1.0" encoding="GBK" standalone="no" ?>
<ROOT>
    <IDCARD_NO type="string">370982</IDCARD_NO>
    <PERSON_NAME type="string">WANGGD</PERSON_NAME>
    <PERSON_AGE type="string">30</PERSON_AGE>
    <PERSON_ADDRESS type="string">濟南市市中區</PERSON_ADDRESS>
    <PERSON_INFO>
        <COURCE_LIST>
            <COURSE>
                <COURCE_NAME type="string">英語</COURCE>
                <COURCE_SCORE type="string">120</COURCE>
            </COURCE>
            <COURSE>
                <COURCE_NAME type="string">數學</COURCE>
                <COURCE_SCORE type="string">150</COURCE>
            </COURCE>
        </COURCE_LIST>
        
        <HOBBYS_LIST>
            <HOBBY>
                <HOBBY_NAME type="string">足球</HOBBY>
                <HOBBY_TIME type="string">2年</HOBBY>
            </HOBBY>
            <HOBBY>
                <HOBBY_NAME type="string">魔術</HOBBY>
                <HOBBY_TIME type="string">2年</HOBBY>
            </HOBBYS>
        </HOBBYS_LIST>    
    </PERSON_INFO>
</ROOT>
 * @author Administrator
 *
 */
public class QueryPersonInfoResponse {
    private String idCardNO;
    private String personName;
    private String personAge;
    private String personAddress;
    
    private List<Cource> courceList =new ArrayList<Cource>();
    private List<Hobby> hobbyList =new ArrayList<Hobby>();
    public List<Cource> getCourceList() {
        return courceList;
    }
    public void setCourceList(List<Cource> courceList) {
        this.courceList = courceList;
    }
    public List<Hobby> getHobbyList() {
        return hobbyList;
    }
    public void setHobbyList(List<Hobby> hobbyList) {
        this.hobbyList = hobbyList;
    }
    public String getIdCardNO() {
        return idCardNO;
    }
    public void setIdCardNO(String idCardNO) {
        this.idCardNO = idCardNO;
    }
    public String getPersonName() {
        return personName;
    }
    public void setPersonName(String personName) {
        this.personName = personName;
    }
    public String getPersonAge() {
        return personAge;
    }
    public void setPersonAge(String personAge) {
        this.personAge = personAge;
    }
    public String getPersonAddress() {
        return personAddress;
    }
    public void setPersonAddress(String personAddress) {
        this.personAddress = personAddress;
    }
    
}


這里一般還要在寫一個解析入參對象request和出參對象response的方法
package com.dongaiqin.parsexml;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.dongaiqin.objects.Cource;
import com.dongaiqin.objects.Hobby;
import com.dongaiqin.objects.QueryPersonInfoRequest;
import com.dongaiqin.objects.QueryPersonInfoResponse;
import com.dongaiqin.objects.RequestInfo;
import com.dongaiqin.objects.ResponseHead;

public class MyParseXml {

    public static String parseQueryPersonInfoRequest2XML(QueryPersonInfoRequest request){
        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\" ?>").append("\n");
        sb.append("<ROOT>").append("\n");
        sb.append("<REQUEST_INFO>").append("\n");
        sb.append("<IDCARD_NO type=\"string\">"+request.getRequestInfo().getIdCardNo()+"</IDCARD_NO>").append("\n");
        sb.append("<PERSON_NAME type=\"string\">"+request.getRequestInfo().getPersonName()+"</PERSON_NAME>").append("\n");
        sb.append("</REQUEST_INFO>").append("\n");
        sb.append("</ROOT>").append("\n");
        return sb.toString();
    }
    
    public static QueryPersonInfoResponse parseXMLQueryPersonInfoResponse(String xml){
        Document document=null;
        try {
            document = DocumentHelper.parseText(xml);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        QueryPersonInfoResponse response =new QueryPersonInfoResponse();
        Element root = document.getRootElement();
        String IDCARD_NO = root.elementTextTrim("IDCARD_NO");
        String PERSON_NAME = root.elementTextTrim("PERSON_NAME");
        String PERSON_AGE = root.elementTextTrim("PERSON_AGE");
        String PERSON_ADDRESS = root.elementTextTrim("PERSON_ADDRESS");
        List<Element> courceList = root.elements("COURSE_INFO");
        List<Element> hobbysList = root.elements("HOBBYS_INFO");
        List<Cource> cources = new ArrayList<Cource>();
        List<Hobby> hobbys = new ArrayList<Hobby>();
        ResponseHead responseHead = new ResponseHead();
        responseHead.setIdCardNO(IDCARD_NO);
        responseHead.setPersonName(PERSON_NAME);
        responseHead.setPersonAge(PERSON_AGE);
        responseHead.setPersonAddress(PERSON_ADDRESS);
        
        for(Element cource :courceList){
            Cource c = new Cource();
            c.setCourceName(cource.elementTextTrim("COURCE_NAME"));
            c.setCourceScore(cource.elementTextTrim("COURCE_SCORE"));
            cources.add(c);
            response.setCourceList(cources);
        }
        
        for(Element cource :hobbysList){
            Hobby h = new Hobby();
            h.setHobbyName(cource.elementTextTrim("HOBBY_NAME"));
            h.setHobbyTime(cource.elementTextTrim("HOBBY_TIME"));
            hobbys.add(h);
            response.setHobbyList(hobbys);
        }
        
        return response;
    }
    
    
    
    public static void main(String[] args) {
        QueryPersonInfoRequest request = new QueryPersonInfoRequest();
        RequestInfo info = new RequestInfo();
        info.setIdCardNo("370982");
        info.setPersonName("wanggd");
        request.setRequestInfo(info);
        
      System.out.println(parseQueryPersonInfoRequest2XML(request));
    }
}

接下來做一個關鍵性的操作,把客戶的代碼導成一個jar包,供其他的應用使用

在桌面上可以看到生成的jar包, 看了一下屬性 290kb 

新建web工程: callWebserviceDemo 測試webservice的客戶端是否可以使用

並且要添加axis2的支持

把 webserviceClientDemo.jar 放到上面工程的lib目錄下面

編寫webservice服務:    QueryPersonInfo   的客戶端調用的測試代碼

測試代碼如下:

測試代碼如下:

package test;

import java.rmi.RemoteException;

import com.dongaiqin.objects.QueryPersonInfoRequest;

import com.dongaiqin.objects.RequestInfo;

import com.dongaiqin.parsexml.MyParseXml;

import com.dongaiqin.wanggd.WebServiceServerDemoStub;

public class WebServiceServerDemoClient {

     public static void main(String[] args) throws RemoteException {

         String target = "http://localhost:8080/axis2/services/WebServiceServerDemo";

         WebServiceServerDemoStub stub = new WebServiceServerDemoStub(target);

         //callservice是方法名

         WebServiceServerDemoStub.CallService callservice = new WebServiceServerDemoStub.CallService();

         // 創建editUser方法的參數,User.java類型的參數

         RequestInfo requestInfo = new RequestInfo();

         requestInfo.setIdCardNo("370982");

         requestInfo.setPersonName("WANGGD");

         QueryPersonInfoRequest request = new QueryPersonInfoRequest();

         request.setRequestInfo(requestInfo);

         callservice.setRequstXml(MyParseXml.parseQueryPersonInfoRequest2XML(request));

         System.out.println("入參報文信息:");

         System.out.println(MyParseXml.parseQueryPersonInfoRequest2XML(request));

          WebServiceServerDemoStub.CallServiceResponse response = stub.callService(callservice);

         System.out.println("出參報文信息:");

         System.out.println(response.get_return());

        }

}

運行測試程序,輸出結果如下

入參報文信息:

<?xml version="1.0" encoding="GBK" standalone="no" ?>

<ROOT>

<REQUEST_INFO>

<IDCARD_NO type="string">370982</IDCARD_NO>

<PERSON_NAME type="string">WANGGD</PERSON_NAME>

</REQUEST_INFO>

</ROOT>

 

出參報文信息:

<?xml version="1.0" encoding="GBK" standalone="no" ?>

<ROOT>

<IDCARD_NO type="string">370982</IDCARD_NO>

<PERSON_NAME type="string">WANGGD</PERSON_NAME>

<PERSON_AGE type="string">30</PERSON_AGE>

<PERSON_ADDRESS type="string">濟南市中區</PERSON_ADDRESS>

<PERSON_INFO>

<COURCE_LIST>

<COURSE>

<COURCE_NAME type="string">英語</COURCE>

<COURCE_SCORE type="string">120</COURCE>

</COURSE>

<COURSE>

<COURCE_NAME type="string">數學</COURCE>

<COURCE_SCORE type="string">150</COURCE>

</COURSE>

</COURCE_LIST>

<HOBBYS_LIST>

<HOBBY>

<HOBBY_NAME type="string">足球</HOBBY>

<HOBBY_TIME type="string">2年</HOBBY>

</HOBBY>

<HOBBY>

<HOBBY_NAME type="string">魔術</HOBBY>

<HOBBY_TIME type="string">2年</HOBBY>

</HOBBY>

</HOBBYS_LIST>

</PERSON_INFO>

</ROOT>

---------------------------------------------------------------------

Ok ,就到這里了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM