Delphi调用Webservice的例子Word文件下载.docx
- 文档编号:21449562
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:11
- 大小:110.60KB
Delphi调用Webservice的例子Word文件下载.docx
《Delphi调用Webservice的例子Word文件下载.docx》由会员分享,可在线阅读,更多相关《Delphi调用Webservice的例子Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
I'
vecreatedasampleform,whichlookslikethis:
Nowwe'
vesetuptheHTTPRio,andthecodebehindtheGetZipCodesbuttonis:
procedureTForm1.Button1Click(Sender:
TObject);
begin
(HTTPRIO1asZipCodesSoap).rtnZipDS(edtCity.Text,edtState.Text);
vealsoaddedaneventhandlerontheHTTPRio1.OnAfterExecutelikeso:
procedureTForm1.HTTPRIO1AfterExecute(constMethodName:
SOAPResponse:
TStream);
SOAPResponse.Position:
=0;
Memo1.Lines.LoadFromStream(SOAPResponse);
ThisisonlytodisplaythereturnedcontentontoaMemosowecanfigureoutwhattodowithit.Here'
showtheformlooksnow:
Interpretingthe.NETXML
WehavetofigureouthowtogetDelphitoUSEthisdata.WewouldliketohaveaClientDataSetreadtheXMLsowecandisplayitallinaGrid.Forthatwe'
llhavetouseXDRtransforms.No,that'
snotverycomplicated,andhere'
showwe'
lldoit.
1.Firstwe'
regoingtosavetheXMLreturnedintoanXMLfile.I'
vesaveditas"
data.xml"
.
2.RunXMLmapperfromtheToolsmenu,andopenthisXMLfile.Here'
samegascreenshot:
3.TheZIPDATA(*)meansthere'
smultiplerowsof"
ZIPDATA"
available.ColumnsavailablareZip,City,State,CountyandAreaCode.Let'
sdouble-clickeachoneofthesetoaddthemtothetransformationandthenclicktheDataPacketfromXMLintheCreateMenu.Here'
swhatitalllookslike:
4.SavetheTransformationusingFile|Save|Transformation,as"
Ziptrans.xtr"
.Don'
ttrytotestthetransformationyet.(There'
sabuginDelphiSourcecodethatdoesn'
tlikeSOAPnamespacesincertainelementssoitdoesn'
tshowupanydata).
5.We'
llnowFIXthisbug.TheXTRfileisanXMLfilewhichyoucanopeninanytexteditor.Openit,andchangethefirstlinefrom:
<
SelectEachdest="
DATAPACKET\ROWDATA\ROW"
from="
\soap:
Envelope\soap:
Body\...."
>
[ChangeTo]
\Envelope\soap:
ThereasonforthisisthatDelphi'
sXMLTransformproviderdoesnotlikethe"
soap:
"
inthefirstelementofthe"
from"
attribute.Thatmightgetfixedinsomeupdatepack,sothispointmightnotapply
6.We'
renearlythere.DropaTClientDataset,aTXMLTransformProviderandaTDatasourceontheform.Here'
swhattheformlookslikenow:
LinktheGrid,theDatasourceandtheClientDataset,andsettheClientDataset'
sProviderNametopointtotheXMLTransformProvider.7.SettheTransformRead.TransformationFileoftheXMLTransformProvidertoZiptrans.XTR.
8.NowweneedtosetthedataoftheXMLTransformProvideratruntime.Here'
ssomeadditionalcodeintheHTTPRio'
sOnAfterExecute:
var
XMLDoc:
IXMLDocument;
ClientDataset1.Active:
=FALSE;
XMLDoc:
=NewXMLDocument;
XMLDoc.Encoding:
=SUTF8;
XMLDoc.LoadFromStream(SOAPResponse);
XMLTransformProvider1.TransformRead.SourceXmlDocument:
=XMLDoc.GetDOMDocument;
=TRUE;
You'
llnoticethatwe'
vecreatedanXMLDocument,loadeditfromtheReceivedSOAPstream,andappliedthetransformtoit.Theclientdatasetgetsdatafromtheprovideranddisplaysthedata:
That'
sit!
Amazing.
Thankyou.
What'
snext?
ThistransformationisveryspecifictothisparticularserviceandXMLschema.SOifyouknowwhatXMLisgoingtobereturned(theformat)thenyoucanuseXMLmappertogenerateatransformationforit.
Ihaven'
tbeenabletowritea"
general"
transformthatcanbeappliedtoANY.NETreturnedXML,butifanyonedoesI'
dlovetohearaboutit.
Also,whyhaveIusedtheHTTPRio'
sOnAfterExecute,ratherthanmanipulatingthethes_schemaparameter?
There'
sanotherbuginDelphithatdoesn'
tlikeparametersreturnedasXML.Morerevealedinthisthread.
Youcandownloadallthecodeforthisprojectatorat
DeepakShenoy(shenoy@)isaDirectoratAgniSoftware,asoftwarecompanyinIndiathatoffersconsultancyandoffshoredevelopmentsolutions.Itmightbeawhilebeforehishairgetspointysohe'
sallowedtounderstandsometechnology.
在微软中国找到了一个官方的说法------不建议将DataSet直接作为返回值传送,因为里面含有大量复杂的schema以及更改等信息,大部分非.NET语言在解析上有困难。
建议使用DataSet.WriteXML方法将简化后的XML版本作为一个WideString回传。
经过试验,已经在Delphi下轻松通过,Delphi中还需要使用XMLMapper工具事先生成Transfomation(XTR)文件。
Delphi7客户端代码
----------------------------------------------------------------------------------------------------------------------------
unitWSTestMain;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,InvokeRegistry,StdCtrls,Rio,SOAPHTTPClient,Grids,DBGrids,
DB,DBClient,DBTables,Provider,xmldom,Xmlxform,XMLIntf,XMLDoc,SOAPConst;
type
TForm1=class(TForm)
HTTPRIO1:
THTTPRIO;
Button1:
TButton;
Memo1:
TMemo;
XMLTransformProvider1:
TXMLTransformProvider;
ClientDataSet1:
TClientDataSet;
DataSource1:
TDataSource;
DBGrid1:
TDBGrid;
procedureButton1Click(Sender:
private
{Privatedeclarations}
public
{Publicdeclarations}
var
Form1:
TForm1;
implementation
usesWSTestDefine;
{$R*.dfm}
A:
Service1Soap;
B:
WideString;
begin
A:
=HTTPRIO1asService1Soap;
B:
=A.GetPersonTable;
Memo1.Lines.Add(B);
XMLDoc.LoadFromXML(B);
end.
---------------------------------------------------------------------------------------
.NETWebService代码
System.Text.StringBuilderstrbuilder=newSystem.Text.StringBuilder();
StringWriterwriter=newStringWriter(strbuilder);
dataset.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema);
returnstrbuilder.ToString();
classXmlDatasetConvert
{
//将xml对象内容字符串转换为DataSet
publicstaticDataSetConvertXMLToDataSet(stringxmlData)
StringReaderstream=null;
XmlTextReaderreader=null;
try
DataSetxmlDS=newDataSet();
stream=newStringReader(xmlData);
//从stream装载到XmlTextReader
reader=newXmlTextReader(stream);
xmlDS.ReadXml(reader);
returnxmlDS;
}
catch(System.Exceptionex)
throwex;
finally
if(reader!
=null)
reader.Close();
//将xml文件转换为DataSet
publicstaticDataSetConvertXMLFileToDataSet(stringxmlFile)
XmlDocumentxmld=newXmlDocument();
xmld.Load(xmlFile);
stream=newStringReader(xmld.InnerXml);
//xmlDS.ReadXml(xmlFile);
//将DataSet转换为xml对象字符串
publicstaticstringConvertDataSetToXML(DataSetxmlDS)
MemoryStreamstream=null;
XmlTextWriterwriter=null;
stream=newMemoryStream();
writer=newXmlTextWriter(stream,Encoding.Unicode);
//用WriteXml方法写入文件.
xmlDS.WriteXml(writer);
intcount=(int)stream.Length;
byte[]arr=newbyte[count];
stream.Seek(0,SeekOrigin.Begin);
stream.Read(arr,0,count);
UnicodeEncodingutf=newUnicodeEncoding();
returnutf.GetString(arr).Trim();
if(writer!
writer.Close();
//将DataSet转换为xml文件
publicstaticvoidConvertDataSetToXMLFile(DataSetxmlDS,stringxmlFile)
//返回Unicode编码的文本
StreamWritersw=newStreamWriter(xmlFile);
sw.WriteLine("
?
xmlversion=\"
1.0\"
encoding=\"
utf-8\"
);
sw.WriteLine(utf.GetString(arr).Trim());
sw.Close();
}}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 调用 Webservice 例子
![提示](https://static.bdocx.com/images/bang_tan.gif)