欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
非.NET語(yǔ)言調用.NET XML Web Services返回的數據集合的兩個(gè)方法
摘要
本文介紹了如何在非.NET語(yǔ)言環(huán)境中(如Java、Delphi等)調用.NET XML Web Services,并特別針對很多開(kāi)發(fā)者所關(guān)心的"如何在Java/Delphi中使用.NET的Web Service返回的DataSet"的問(wèn)題,提出了兩個(gè)解決方案:使用自定義類(lèi)型數組和使用DataSet.WriteXML()。

目錄
  • 1. 概述
  • 2. 創(chuàng )建.NET Web Services,返回數據集合
  • 3. 在Java中調用.NET Web Services,處理返回的數據集合
  • 4. 小結

1.概述
很多正在開(kāi)發(fā)或者打算開(kāi)發(fā)XML Web Services的程序員都問(wèn)過(guò)這樣的一個(gè)問(wèn)題:"我的Web Service返回的結果是一個(gè)DataSet類(lèi)型的對象,但如果我的客戶(hù)端不是用.NET寫(xiě)的(因而沒(méi)有內建的DataSet類(lèi)型),那該如何調用這個(gè)Web Service并訪(fǎng)問(wèn)DataSet中的數據呢?"。
對于這個(gè)問(wèn)題,首先應該說(shuō)的是:1)在多種語(yǔ)言共存的編程環(huán)境下,是不適合使用類(lèi)似DataSet這種只屬于特定語(yǔ)言的數據類(lèi)型的。不管是在XML Web Services還是CORBA的環(huán)境中,都應該盡量使用簡(jiǎn)單數據類(lèi)型以及簡(jiǎn)單數據類(lèi)型的數組。2)應當很謹慎的決定是否需要通過(guò)
Web Service來(lái)返回大量數據。由于網(wǎng)絡(luò )傳輸的開(kāi)銷(xiāo)既包括HTTP連接建立的時(shí)間,也包括傳送數據的時(shí)間,因此需要在減少訪(fǎng)問(wèn)服務(wù)器次數和減少網(wǎng)絡(luò )傳輸量之間尋找一個(gè)合適的平衡。如非必須,則不適合通過(guò)Web Service傳送含有幾十條或者幾百條數據的數據表。
然后,就問(wèn)題本身而言,.NET Web Services返回的DataSet類(lèi)型是可以直接被其他非.NET的客戶(hù)端解析的,因為即便是DataSet類(lèi)型的返回值,也會(huì )被表達成XML格式再進(jìn)行傳輸。下面的例子就是一個(gè)返回類(lèi)型為DataSet的Web Method,及其被調用后返回的XML格式數據:
[WebMethod]
public DataSet GetPersonData()
{
    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","Male"});
                
    DataSet dataset
=new DataSet("PersonTable");
    dataset.Tables.Add(table);
         
return dataset;
}

圖表1. 返回類(lèi)型為DataSet的Web Method
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
  
<xs:schema id="PersonTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:msdata
="urn:schemas-microsoft-com:xml-msdata">
    
<xs:element name="PersonTable" msdata:IsDataSet="true" msdata:Locale="zh-CN">
      
<xs:complexType>
        
<xs:choice maxOccurs="unbounded">
          
<xs:element name="Person">
            
<xs:complexType>
              
<xs:sequence>
                
<xs:element name="Name" type="xs:string" minOccurs="0" />
                
<xs:element name="Gender" type="xs:string" minOccurs="0" />
              
</xs:sequence>
            
</xs:complexType>
          
</xs:element>
        
</xs:choice>
      
</xs:complexType>
    
</xs:element>
  
</xs:schema>
  
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
    xmlns:diffgr
="urn:schemas-microsoft-com:xml-diffgram-v1">
    
<PersonTable xmlns="">
      
<Person diffgr:id="Person1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
        
<Name>Alice</Name>
        
<Gender>Female</Gender>
      
</Person>
      
<Person diffgr:id="Person2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
        
<Name>Bob</Name>
        
<Gender>Male</Gender>
      
</Person>
      
<Person diffgr:id="Person3" msdata:rowOrder="2" diffgr:hasChanges="inserted">
        
<Name>Chris</Name>
        
<Gender>Male</Gender>
      
</Person>
    
</PersonTable>
  
</diffgr:diffgram>
</DataSet>
圖表2. 被格式化成XML的DataSet
從上面的例子可以看出,直接使用DataSet作為返回類(lèi)型,其結果是相當復雜的,其中不但包含了DataSet中的數據,還包括了數據更改的信息,以及DataSet的Schema。雖然有些工具能夠生成一個(gè)類(lèi)似DataSet的客戶(hù)端類(lèi)型,但無(wú)論是直接解析復雜的XML還是使用類(lèi)似DataSet的類(lèi),都不夠直接不夠清晰。
解決這個(gè)問(wèn)題的方案有兩種:
1) 用簡(jiǎn)單數據類(lèi)型構造自定義類(lèi)型,用每一個(gè)自定義類(lèi)型對象封裝數據集中的一行,將自定義類(lèi)型對象的數組(Array)返回客戶(hù)端;由于是用簡(jiǎn)單數據類(lèi)型定義,客戶(hù)端能夠完全不變的還原出自定義類(lèi)型的定義;
2) 用DataSet.WriteXML()方法將數據集中的數據提取成XML格式,并以字符串的形式返回給客戶(hù)端,再由客戶(hù)端解析XML字符串,還原出數據。由于使用WriteXML()的時(shí)候能夠過(guò)濾掉冗余信息,返回的內容和圖表2中的內容相比大大簡(jiǎn)化了。
下面就將用C#分別實(shí)現這兩種方案,并詳細演示如何在Java客戶(hù)端中調用并獲取數據。

2. 創(chuàng )建.NET Web Services,返回數據集合
借助于Visual Studio.NET,只需編寫(xiě)Web Method本身的代碼,即可非??焖俚膭?chuàng )建可以實(shí)用的Web Services:
[WebMethod]
public Person[] GetPersons()
{
    Person Alice
=new Person("Alice","Female");
    Person Bob
=new Person("Bob","Male");
    Person Chris
=new Person("Chris","Female");
    Person Dennis
=new Person("Dennis","Male");

    
return new Person[]{Alice,Bob,Chris,Dennis};
}

[WebMethod]
public string GetPersonTable()
{
    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);
    
    System.Text.StringBuilder strbuilder
=new System.Text.StringBuilder();
    StringWriter writer
=new StringWriter(strbuilder);
    dataset.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema);
    
    
return strbuilder.ToString();
}
圖表3. 用.NET實(shí)現的XML Web Services
 
在上面的代碼中,函數GetPersons()和GetPersonTable()分別對應于"1. 概述"中所提到的兩種解決方案。其中,Person類(lèi)型就是用于封裝數據集中一行數據的自定義的數據類(lèi)型:
[Serializable]
public class Person
{
    
public Person()
    {
    }

    
public Person(string name,string gender)
    {
        
this.Name=name;
        
this.Gender=gender;
    }

    
public string Name="";
    
public string Gender="";
}
圖表4. 自定義類(lèi)型Person
下面就是在Internet Exploerer里直接調用這兩個(gè)Web Method所得到的XML格式的結果:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
xmlns
="http://tempuri.org/">
  
<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>
圖表5. GetPersons()的返回結果
 
<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>

圖表6. GetPersonTable()的返回的String類(lèi)型的值
到這里,XML Web Service的創(chuàng )建就已經(jīng)完成了。.NET中創(chuàng )建的XML Web Services遵循的是統一的行業(yè)標準(SOAP、XML等),因此無(wú)論使用.NET語(yǔ)言還是使用非.NET語(yǔ)言,都可以調用它。尤其對于GetPersonTable()返回的結果來(lái)說(shuō),只要用XML Parser作簡(jiǎn)單的處理,就能把數據提取出來(lái)。下面就將演示如何在Java中完成這一處理。

3. 在Java中調用.NET Web Services,處理返回的數據集合
編寫(xiě)客戶(hù)端調用Web Services時(shí),最快速簡(jiǎn)便做法的是利用工具根據Web Services的WSDL描述生成客戶(hù)端代理類(lèi)(Proxy),而不是直接對SOAP Toolkit進(jìn)行編程。在.NET Framework中,這個(gè)工作可以由wsdl.exe完成。在Java中,可以在JBuilder或者VisualAge Java等Java IDE中安裝一個(gè)叫做WASP Developer的免費插件,這個(gè)插件也能完成由WSDL描述生成Proxy類(lèi)的工作。另外,該公司還提供了WASP Server for Java和WASP UDDI,降低了用戶(hù)用Java開(kāi)發(fā)Web Services以及建立UDDI服務(wù)的難度。
在本文的例子中,用了JBuilder 7+WASP Developer來(lái)調用前文中建立的.NET XML Web Services。在調用之前,首先是用WASP Developer生成Proxy類(lèi)。從圖表7、8中可以看到,生成Proxy的工具已經(jīng)在Java中也創(chuàng )建了一個(gè)Person類(lèi):

圖表7. 用WASP Developer生成的Proxy類(lèi)
package javaclient.service1Soap12Clientstruct;

public class Person {
    
public java.lang.String Name;
    
public java.lang.String Gender;
}

/*
 * Generated by WSDLCompiler, (c) 2002, Systinet Corp.
 *                            
http://www.systinet.com
 
*/
圖表8. WASP Developer創(chuàng )建的Person類(lèi)
在Proxy類(lèi)的基礎上,就可以訪(fǎng)問(wèn).NET編寫(xiě)的Web Services并提取數據了。對于GetPersons()來(lái)說(shuō),由于已經(jīng)生成了Person類(lèi),所以調用代碼非常簡(jiǎn)單直接:
import org.idoox.webservice.client.WebServiceLookup;
import org.idoox.wasp.Context;
import javax.swing.*;
import javax.swing.table.*;

try{
  System.setProperty( 
"wasp.location","C:\Home\Util\wasp_4.0SP2");

  javaclient.service1Soap12Client.Service1Soap service;
  String serviceURI 
= "http://localhost/dotNetHost/Service1.asmx";
  String wsdlURI 
= "http://localhost/dotNetHost/Service1.asmx?wsdl";

  WebServiceLookup lookup 
= (WebServiceLookup) Context.getInstance(Context.WEBSERVICE_LOOKUP);
  service 
= (javaclient.service1Soap12Client.Service1Soap) lookup.lookup(
            wsdlURI, 
            javaclient.service1Soap12Client.Service1Soap.
class
            serviceURI);

  Person[] persons
=
   service.GetPersons(
new javaclient.service1Soap12Clientstruct.GetPersons()).GetPersonsResult;
  DefaultTableModel model
=new DefaultTableModel(new String[]{"name","gender"},0);
  
for(int i=0;i<persons.length;i++){
    model.addRow(
new String[]{persons[i].Name.toString(),persons[i].Gender.toString()});
  }
  
this.jTable1.setModel(model);
}
catch(Exception ex)
{
  javax.swing.JOptionPane.showMessageDialog(
this,ex.getMessage());
}
圖表9. 在Java中調用GetPersons()的代碼
調用GetPersonTable()并解析XML字符串要相對復雜一些,需要用到XML Parser從圖表6中的XML字符串中提取數據,并逐一顯示在JTable中。下面是從訪(fǎng)問(wèn)Web Method到解析XML,最后提取數據并顯示的完整代碼,及其運行結果截圖:
import javax.swing.*;
import javax.swing.table.*;

import org.idoox.webservice.client.WebServiceLookup;
import org.idoox.wasp.Context;

import org.w3c.dom.*;
import org.apache.xml.serialize.*;
import org.apache.xerces.dom.*;

try{
  System.setProperty( 
"wasp.location","C:\Home\Util\wasp_4.0SP2");

  javaclient.service1Soap12Client.Service1Soap service;
  String serviceURI 
= "http://localhost/dotNetHost/Service1.asmx";
  String wsdlURI 
= "http://localhost/dotNetHost/Service1.asmx?wsdl";

  WebServiceLookup lookup 
= (WebServiceLookup) Context.getInstance(Context.WEBSERVICE_LOOKUP);
  service 
= (javaclient.service1Soap12Client.Service1Soap) lookup.lookup(
            wsdlURI, 
            javaclient.service1Soap12Client.Service1Soap.
class
            serviceURI);

  String result
=
   service.GetPersonTable(
new javaclient.service1Soap12Clientstruct.GetPersonTable()).GetPersonTableResult;
  DefaultTableModel model
=new DefaultTableModel(new String[]{"name","gender"},0);

  java.io.StringReader reader
=new java.io.StringReader(result);
  org.apache.xerces.parsers.DOMParser parser
=new org.apache.xerces.parsers.DOMParser();
  parser.parse(
new org.xml.sax.InputSource(reader));
  org.w3c.dom.Document document
=parser.getDocument();
  org.w3c.dom.NodeList children
=document.getDocumentElement().getChildNodes();

  
for(int i=0;i<children.getLength();i++){
    org.w3c.dom.Node node
=children.item(i);
    
if(node.getNodeName().equals("Person")){
      org.w3c.dom.NodeList personAttrNodes
=node.getChildNodes();
      String name
="N/A";
      String gender
="N/A";

      
for(int j=0;j<personAttrNodes.getLength();j++){
        org.w3c.dom.Node attrNode
=personAttrNodes.item(j);
        String attrNodeName
=attrNode.getNodeName();
        
if(attrNodeName.equals("Name")){
          name
=attrNode.getFirstChild().getNodeValue();
        }
else if(attrNodeName.equals("Gender")){
          gender
=attrNode.getFirstChild().getNodeValue();
        }
else{
          
continue;
        }
      }
      model.addRow(
new String[]{name,gender});
    }
  }
  
this.jTable1.setModel(model);
}
catch(Exception ex)
{
  javax.swing.JOptionPane.showMessageDialog(
this,ex.getMessage());
}
圖表10. 在Java中調用GetPersonTable()的代碼

圖表11.調用GetPersonTable()的運行結果

4. 小結
從前面的敘述和代碼中可以看出,對于"如何在Java/Delphi中使用.NET的Web Service返回的DataSet"的問(wèn)題,雖然在非.NET語(yǔ)言環(huán)境中直接接受DataSet類(lèi)型的返回值比較困難,但可以有其他的解決方案。
對于第一種解決方案,也就是采用自定義數據類(lèi)型,它的優(yōu)點(diǎn)是客戶(hù)端代碼非常簡(jiǎn)單,容易編寫(xiě),而且容易理解。它的缺點(diǎn)是服務(wù)器端需要定義新的類(lèi),而且當通過(guò)ADO.NET從數據庫中提取數據以后,還要再手工編寫(xiě)代碼,將DataSet中的數據遍歷一遍,轉存成自定義類(lèi)型的對象。
對于第二種解決方案,就是用DataSet.WriteXML()的方案,它的優(yōu)點(diǎn)和缺點(diǎn)正好和第一種方案是互補的。它在客戶(hù)端需要編寫(xiě)較多的代碼,尤其是需要用XML Parser編程,提高了編程的難度。另一方面,它在服務(wù)器端比較簡(jiǎn)單。如果開(kāi)發(fā)者在原先的純.NET環(huán)境(即客戶(hù)端也是.NET)中已經(jīng)開(kāi)發(fā)了返回類(lèi)型為DataSet的Web Services,那么當開(kāi)發(fā)者希望在客戶(hù)端引入非.NET語(yǔ)言時(shí),服務(wù)器端只需要簡(jiǎn)單的再增加一個(gè)Web Method,通過(guò)簡(jiǎn)單的WriteXML()調用對原有的方法進(jìn)行簡(jiǎn)單的包裝,就能夠適用于非.NET客戶(hù)端了。
從更廣闊的角度來(lái)看,上面兩種解決方案也可以用在"非.NET服務(wù)器+.NET客戶(hù)端"的Web Services環(huán)境中。在各種非原生(Native)的情況下,盡量使用簡(jiǎn)單數據類(lèi)型,或者使用XML來(lái)表達數據,總是上佳的選擇。

作者:鄭子穎
 http://www.microsoft.com/china/community/program/originalarticles/techdoc/callwebs.mspx

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1589610

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C#中將dataset轉換成xml格式的string型,以及將xml格式的string型轉換成dataset
xstream 解析xml 別名 注解 list集合 boolean 數組 converter Pom.xml設置
JDK6的新特性之二:使用JAXB2來(lái)實(shí)現對象與XML之間的映射
【.NET 框架】—— Dapper框架基于Sqlserver數據庫CRUD操作(一)
Vistual Studio自帶的xsd.exe工具,根據XML自動(dòng)生成XSD
從一個(gè)范例看XML的應用
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久