设为首页 收藏本站
查看: 488|回复: 0

[经验分享] apache axis 解析.netc# wse dataset

[复制链接]

尚未签到

发表于 2017-1-6 06:57:43 | 显示全部楼层 |阅读模式
package etpsmsws.etpsms.hnas;


import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.MessageElement;
import org.apache.axis.types.Schema;

/**
* <p>
* Title:
* </p>
* <p>
* Description:
* </p>
* <p>
* Copyright: Copyright (c) 2004
* </p>
* <p>
* Company:
* </p>
*
* @author not attributable
* @version 1.0
*/
public class testSoap2 {
public testSoap2() {
}

public static void main(String[] args) {
try {

String wsdlUrl = "http://test";
String soapActionURI = "HNAS.EtpSms.EtpSmsWS/GetRecvFromTemp";

Service service = new Service();
Call call = (Call) service.createCall();
//
//call.setOperationName(new QName("HNAS.EtpSms.EtpSmsWS",
//"EtpSmsWSSoap"));
call.setOperationName(new QName("HNAS.EtpSms.EtpSmsWS",
"GetRecvFromTemp"));
call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
call.addParameter(new QName("HNAS.EtpSms.EtpSmsWS", "iMemberId"),
org.apache.axis.encoding.XMLType.XSD_INT,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_SCHEMA);
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapActionURI);

Object[] objs = new Object[] { "8918"};
Object res = call.invoke(objs);
// System.out.println(res);
Schema schema = (Schema) res;
MessageElement[] messageElement = schema.get_any();
for (int i = 0; i < messageElement.length; i++) {
// System.out.println(messageElement.getChildElements());
// System.out.println(messageElement.getRealElement()
// .getChildren());

Iterator iterator = messageElement.getChildElements();
while (iterator.hasNext()) {
MessageElement m = (MessageElement) iterator.next();
m = m.getRealElement();
Iterator it = m.getChildElements();
while (it.hasNext()) {
m = (MessageElement) it.next();
it = m.getChildElements();
while (it.hasNext()) {
m = (MessageElement) it.next();
System.out.println(m.getValue());
}
}
}
}

} catch (Exception ex) {
System.err.println(ex.toString());
}
}
}


注意事项:
参数必须是String类型的,你定义的是啥类型不管。
setOperationName 要给方法名。







1. 概述
  
  很多正在开发或者打算开发XML Web Services的程序员都问过这样的一个问题:"我的Web Service返回的结果是一个DataSet类型的对象,但如果我的客户端不是用.NET写的(因而没有内建的DataSet类型),

那该如何调用这个Web Service并访问DataSet中的数据呢?"。
  
  对于这个问题,首先应该说的是:1)在多种语言共存的编程环境下,是不适合使用类似DataSet这种只属于特定语言的数据类型的。不管是在XML Web Services还是CORBA的环境中,都应该尽量使用简单数据类型以及简单数据类型的数组。2)应当很谨慎的决定是否需要通过Web Service来返回大量数据。由于网络传输的开销既包括HTTP连接建立的时间,也包括传送数据的时间,因此需要在减少访问服务器次数和减少网络传输量之间寻找一个合适的平衡。如非必须,则不适合通过Web Service传送含有几十条或者几百条数据的数据表。
  
  然后,就问题本身而言,.NET Web Services返回的DataSet类型是可以直接被其他非.NET的客户端解析的,因为即便是DataSet类型的返回值,也会被表达成XML格式再进行传输。下面的例子就是一个返回类型为DataSet的Web Method,及其被调用后返回的XML格式数据:

2. 创建.NET Web Services,返回数据集合
    [WebMethod]
    public DataSet GetPersonTable(string str)
    ...{
        DataTable table = new DataTable("Person");
        table.Columns.Add("Name");
        table.Columns.Add("Gender");
        table.Rows.Add(new string[2] ...{ "Alice", "Female" });
        table.Rows.Add(new string[2] ...{ "Bob", "Male" });
        table.Rows.Add(new string[2] ...{ "Chris", "Female" });
        table.Rows.Add(new string[2] ...{ "Dennis", "Male" });
        table.Rows.Add(new string[2] ...{ "Eric", "Male" });

        DataSet dataset = new DataSet("PersonTable");
        dataset.Tables.Add(table);

        return dataset;
    }

3. 在Java中调用.NET Web Services,处理返回的数据集合
try ...{

            String wsdlUrl = "http://localhost/WebSite1/Service.asmx?op=GetPersonTable";   
            String soapActionURI = "http://tempuri.org/GetPersonTable";   

            Service service = new Service();   
            Call call = (Call) service.createCall();   
            //  
            call.setOperationName(new QName("http://tempuri.org/","GetPersonTable"));
            call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
            call.addParameter("a", org.apache.axis.encoding.XMLType.XSD_STRING,   
                    javax.xml.rpc.ParameterMode.IN);
            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_SCHEMA);   
            call.setUseSOAPAction(true);   
            call.setSOAPActionURI(soapActionURI);
            
            Object[] objs = new Object[]...{"ssss"};
            Object res = call.invoke( objs );
            System.out.println(res);
            Schema schema = (Schema)res;
                     
            DefaultTableModel model=new  DefaultTableModel(new String[]...{"name","gender"},0);
            schema.get_any()[1].getChildNodes().getLength();
            int nLength=schema.get_any()[1].getChildNodes().item(0).getChildNodes().getLength();
            String name="N/A";
            String gender="N/A";
            for(int i=0;i<nLength;i++)
            ...{
                if(schema.get_any()[1].getChildNodes().item(0).getChildNodes().item(i).getChildNodes().item(0).getNodeName().equals("Name"))
                ...{
                    name=schema.get_any()[1].getChildNodes().item(0).getChildNodes().item(i).getChildNodes().item(0).getFirstChild().getNodeValue();
                }
                if(schema.get_any()[1].getChildNodes().item(0).getChildNodes().item(i).getChildNodes().item(1).getNodeName().equals("Gender"))
                ...{
                    gender=schema.get_any()[1].getChildNodes().item(0).getChildNodes().item(i).getChildNodes().item(1).getFirstChild().getNodeValue();
                }   
                model.addRow(new String[]...{name,gender});
                this.jScrollPane1.getViewport().add(jTable1, null);
            }
            jTable1.setModel(model);        
      }
      catch (Exception ex)
      ...{            
          System.err.println(ex.toString());
      }              



4. 小结
  
  从前面的叙述和代码中可以看出,对于"如何在Java/Delphi中使用.NET的Web Service返回的DataSet"的问题,虽然在非.NET语言环境中直接接受DataSet类型的返回值比较困难,但可以有其他的解决方案。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324383-1-1.html 上篇帖子: apache + tomcat 一个网站多域名 下篇帖子: windows下使用apache配置django应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表