熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

調用.NET XML Web Services返回數據集合二

2013-11-13 10:16:05  來源: .NET編程 

  下面就是在Internet Exploerer裡直接調用這兩個Web Method所得到的XML格式的結果
  
  表 GetPersons()的返回結果
  <?xml version= encoding=utf?>
  <ArrayOfPerson xmlns:xsd=
  xmlns:xsi=instance
  xmlns=>
  <Person>
  <Name>Alice</Name>
  <Gender>Female</Gender>
  </Person>
  <Person>
  <Name>Bob</Name>
  <Gender>Male</Gender>
  </Person>
  <Person>
  <Name>Chris</Name>
  <Gender>Female</Gender>
  </Person>
  <Person>
  <Name>Dennis</Name>
  <Gender>Male</Gender>
  </Person>
  </ArrayOfPerson>
  
  表 GetPersonTable()的返回的String類型的值
  <PersonTable> <Person>
  <Name>Alice</Name>
  <Gender>Female</Gender>
  </Person> <Person>
  <Name>Bob</Name>
  <Gender>Male</Gender>
  </Person> <Person>
  <Name>Chris</Name>
  <Gender>Female</Gender>
  </Person> <Person>
  <Name>Dennis</Name>
  <Gender>Male</Gender>
  </Person> <Person>
  <Name>Eric</Name>
  <Gender>Male</Gender>
  </Person> </PersonTable>
  
  到這裡XML Web Service的創建就已經完成了NET中創建的XML Web Services遵循的是統一的行業標准(SOAPXML等)因此無論使用NET語言還是使用非NET語言都可以調用它尤其對於GetPersonTable()返回的結果來說只要用XML Parser作簡單的處理就能把數據提取出來下面就將演示如何在Java中完成這一處理
  
   在Java中調用NET Web Services處理返回的數據集合
  
  編寫客戶端調用Web Services時最快速簡便做法的是利用工具根據Web Services的WSDL描述生成客戶端代理類(Proxy)而不是直接對SOAP Toolkit進行編程NET Framework中這個工作可以由wsdlexe完成在Java中可以在JBuilder或者VisualAge Java等Java IDE中安裝一個叫做WASP Developer的免費插件這個插件也能完成由WSDL描述生成Proxy類的工作另外該公司還提供了WASP Server for Java和WASP UDDI降低了用戶用Java開發Web Services以及建立UDDI服務的難度
  
  在本文的例子中用了JBuilder +WASP Developer來調用前文中建立的NET XML Web Services在調用之前首先是用WASP Developer生成Proxy類從圖表中可以看到生成Proxy的工具已經在Java中也創建了一個Person類
  
  表 用WASP Developer生成的Proxy類
  
 educitycn/img_///jpg >

  表 WASP Developer創建的Person類
  
  package javaclientserviceSoapClientstruct;
  
  public class Person {
  public javalangString Name;
  public javalangString Gender;
  }
  
  /*
  * Generated by WSDLCompiler (c) Systinet Corp
  *
  */
  
  表 在Java中調用GetPersons()的代碼
  在Proxy類的基礎上就可以訪問NET編寫的Web Services並提取數據了對於GetPersons()來說由於已經生成了Person類所以調用代碼非常簡單直接
  import orgidooxwebserviceclientWebServiceLookup;
  import orgidooxwaspContext;
  import javaxswing*;
  import javaxswingtable*;
  
  try{
  SystemsetProperty( wasplocationC:\\Home\\Util\\wasp_SP);
  
  javaclientserviceSoapClientServiceSoap service;
  String serviceURI = ;
  String wsdlURI = ;
  
  WebServiceLookup lookup = (WebServiceLookup) ContextgetInstance(ContextWEBSERVICE_LOOKUP);
  service = (javaclientserviceSoapClientServiceSoap) lookuplookup(
  wsdlURI
  javaclientserviceSoapClientServiceSoapclass
  serviceURI);
  
  Person[] persons=
  serviceGetPersons(new javaclientserviceSoapClientstructGetPersons())GetPersonsResult;
  DefaultTableModel model=new DefaultTableModel(new String[]{namegender});
  for(int i=;i<personslength;i++){
  modeladdRow(new String[]{persons[i]NametoString()persons[i]GendertoString()});
  }
  thisjTablesetModel(model);
  }
  catch(Exception ex)
  {
  javaxswingJOptionPaneshowMessageDialog(thisexgetMessage());
  }
  
  調用GetPersonTable()並解析XML字符串要相對復雜一些需要用到XML Parser從圖表中的XML字符串中提取數據並逐一顯示在JTable中下面是從訪問Web Method到解析XML最後提取數據並顯示的完整代碼及其運行結果截圖
  import javaxswing*;
  import javaxswingtable*;
  
  import orgidooxwebserviceclientWebServiceLookup;
  import orgidooxwaspContext;
  
  import orgwcdom*;
  import orgapachexmlserialize*;
  import orgapachexercesdom*;
  
  try{
  SystemsetProperty( wasplocationC:\\Home\\Util\\wasp_SP);
  
  javaclientserviceSoapClientServiceSoap service;
  String serviceURI = ;
  String wsdlURI = ;
  
  WebServiceLookup lookup = (WebServiceLookup) ContextgetInstance(ContextWEBSERVICE_LOOKUP);
  service = (javaclientserviceSoapClientServiceSoap) lookuplookup(
  wsdlURI
  javaclientserviceSoapClientServiceSoapclass
  serviceURI);
  
  String result=
  serviceGetPersonTable(new javaclientserviceSoapClientstructGetPersonTable())GetPersonTableResult;
  DefaultTableModel model=new DefaultTableModel(new String[]{namegender});
  
  javaioStringReader reader=new javaioStringReader(result);
  orgapachexercesparsersDOMParser parser=new orgapachexercesparsersDOMParser();
  parserparse(new orgxmlsaxInputSource(reader));
  orgwcdomDocument document=parsergetDocument();
  orgwcdomNodeList children=documentgetDocumentElement()getChildNodes();
  
  for(int i=;i<childrengetLength();i++){
  orgwcdomNode node=em(i);
  if(nodegetNodeName()equals(Person)){
  orgwcdomNodeList personAttrNodes=nodegetChildNodes();
  String name=N/A;
  String gender=N/A;
  
  for(int j=;j<personAttrNodesgetLength();j++){
  orgwcdomNode attrNode=em(j);
  String attrNodeName=attrNodegetNodeName();
  if(attrNodeNameequals(Name)){
  name=attrNodegetFirstChild()getNodeValue();
  }else if(attrNodeNameequals(Gender)){
  gender=attrNodegetFirstChild()getNodeValue();
  }else{
  continue;
  }
  }
  modeladdRow(new String[]{namegender});
  }
  }
  thisjTablesetModel(model);
  }
  catch(Exception ex)
  {
  javaxswingJOptionPaneshowMessageDialog(thisexgetMessage());
  }
  
educitycn/img_///jpg>

   小結
  
  從前面的敘述和代碼中可以看出對於如何在Java/Delphi中使用NET的Web Service返回的DataSet的問題雖然在非NET語言環境中直接接受DataSet類型的返回值比較困難但可以有其他的解決方案
  
  對於第一種解決方案也就是采用自定義數據類型它的優點是客戶端代碼非常簡單容易編寫而且容易理解它的缺點是服務器端需要定義新的類而且當通過ADONET從數據庫中提取數據以後還要再手工編寫代碼將DataSet中的數據遍歷一遍轉存成自定義類型的對象
  
  對於第二種解決方案就是用DataSetWriteXML()的方案它的優點和缺點正好和第一種方案是互補的它在客戶端需要編寫較多的代碼尤其是需要用XML Parser編程提高了編程的難度另一方面它在服務器端比較簡單如果開發者在原先的純NET環境(即客戶端也是NET)中已經開發了返回類型為DataSet的Web Services那麼當開發者希望在客戶端引入非NET語言時服務器端只需要簡單的再增加一個Web Method通過簡單的WriteXML()調用對
From:http://tw.wingwit.com/Article/program/net/201311/13112.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.