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