Java调用.NET XML Web Services返回的DataSet


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类型的返回值比较困难,但可以有其他的解决方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值