分享
 
 
 

Delphi 6 XML数据绑定

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Delphi 6 含有许多更新更强的XML支持功能,增加了XML文件编程,XML数据绑定向导,XML映象和BizSnap(SOAP/XML Web服务)。我在上一篇文章论述了Delphi 6中的XML文件编程(XML Document Programming)。本文是三篇论述Delphi 6中XML功能系列文章的第二篇,论述Delphi 6中的XML数据绑定(XML Data Binding)。

XML文件编程

XMLDocument组件让我们能够遍历和编辑XML文件。但是在上一篇文章中我提到了,我们只能与无类型节点打交道,必须记住节点元素的名字。这意味着无法进行实时编译调试!幸亏的是,如果Delphi只能处理这样简单的问题就不成其为Delphi了。运用XML的内容相关结构可以做更高级的应用,这就是Delphi 6的XML数据绑定向导(XML Data Binding Wizard)。

XML数据绑定

在Delphi 6的模块仓库(Object Repository)中可以找到XML数据绑定向导(XML Data Binding Wizard)。程序员能够用它生成相应的接口和类来访问与修改XML文件数据,诸如ClientDataSetXML数据,ADO XML数据,其它XML文件数据(如我们在前文用到的Clinic.xml,本文继续使用这个简单的XML文件作示例)。

现在开始吧,启动Delphi 6,在主菜单上选择File | New - Other,然后在仓库中选择XML Data Binding,如图1所示。

向导有三个页面。第一页定义XML纲(Schema)或XML文件(本例用Clinic.xml),如图2所示。

在资源输入框内输入XML纲(Schema)或XML文件。“选项”(Options)对话框定义编码选项和数据类型映射关系(Data Type map)。以后我们还会谈到这些选项。

向导的第二页显示了树结构和节点数据类型(亦即向导生成了些什么样的代码)。图3可以看到我的XML文件结构。

可以看到XML文件里描述的嵌套节点(ClinicsType与ClinicType)和单节点(String)。这时可以打开选项(Options)对话框(图4),修改编码(比如修改前缀)和数据类型映射。

向导的第三页显示生成的相应接口和类。可以把这些结果保存到文件(例如生成Clinic.xdb)。

结果(存储为Clinic.xdb文件)显示如下。我们得到一个ClinicsType类型的Clinics元素,其中包括ClinicType类型的Clinic系列元素。

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:xdb="http://www.borland.com/schemas/delphi/6.0/XMLDataBinding">

<xs:element name="Clinics" type="ClinicsType"/>

<xs:complexType name="ClinicsType">

<xs:annotation>

<xs:appinfo xdb:docElement="Clinics"/>

</xs:annotation>

<xs:sequence>

<xs:element name="Clinic" type="ClinicType" maxOccurs="unbounded"/>

</xs:sequence>

</xs:complexType>

<xs:complexType name="ClinicType">

<xs:sequence>

<xs:element name="Title" type="xs:string"/>

<xs:element name="Date" type="xs:string"/>

<xs:element name="Topics" type="xs:string"/>

</xs:sequence>

<xs:attribute name="No" type="xs:string"/>

</xs:complexType>

</xs:schema>

文件同时定义ClinicType类型的Clinic元素包含一系列字符串元素(Title, Date和Topics)。

生成代码

向导生成的代码可以直接在应用中使用。不幸的是,Delphi 6有时会产生“非法操作”的出错信息。重新执行一遍,它又能工作了。

以下是生成的代码(Clinic.pas):

{****************************************************}

{ }

{ Delphi XML Data Binding }

{ }

{ Generated on: 2001/11/07 00:37:00 }

{ Generated from: D:\D6Clinic\src\Clinic.xml }

{ Settings stored in: D:\D6Clinic\src\Clinic.xdb }

{ }

{****************************************************}

unit Clinic;

interface

uses xmldom, XMLDoc, XMLIntf;

type

{ Forward Decls }

IXMLClinicsType = interface;

IXMLClinicType = interface;

{ IXMLClinicsType }

IXMLClinicsType = interface(IXMLNodeCollection)

['{06723E03-662D-11D5-81CE-00104BF89DAD}']

{ Property Accessors }

function Get_Clinic(Index: Integer): IXMLClinicType;

{ Methods & Properties }

function Add: IXMLClinicType;

function Insert(const Index: Integer): IXMLClinicType;

property Clinic[Index: Integer]: IXMLClinicType

read Get_Clinic; default;

end;

{ IXMLClinicType }

IXMLClinicType = interface(IXMLNode)

['{06723E04-662D-11D5-81CE-00104BF89DAD}']

{ Property Accessors }

function Get_No: WideString;

function Get_Title: WideString;

function Get_Date: WideString;

function Get_Topics: WideString;

procedure Set_No(Value: WideString);

procedure Set_Title(Value: WideString);

procedure Set_Date(Value: WideString);

procedure Set_Topics(Value: WideString);

{ Methods & Properties }

property No: WideString read Get_No write Set_No;

property Title: WideString read Get_Title write Set_Title;

property Date: WideString read Get_Date write Set_Date;

property Topics: WideString read Get_Topics write Set_Topics;

end;

{ Forward Decls }

TXMLClinicsType = class;

TXMLClinicType = class;

{ TXMLClinicsType }

TXMLClinicsType = class(TXMLNodeCollection, IXMLClinicsType)

protected

{ IXMLClinicsType }

function Get_Clinic(Index: Integer): IXMLClinicType;

function Add: IXMLClinicType;

function Insert(const Index: Integer): IXMLClinicType;

public

procedure AfterConstruction; override;

end;

{ TXMLClinicType }

TXMLClinicType = class(TXMLNode, IXMLClinicType)

protected

{ IXMLClinicType }

function Get_No: WideString;

function Get_Title: WideString;

function Get_Date: WideString;

function Get_Topics: WideString;

procedure Set_No(Value: WideString);

procedure Set_Title(Value: WideString);

procedure Set_Date(Value: WideString);

procedure Set_Topics(Value: WideString);

end;

{ Global Functions }

function GetClinics(Doc: IXMLDocument): IXMLClinicsType;

function LoadClinics(const FileName: WideString): IXMLClinicsType;

function NewClinics: IXMLClinicsType;

这里有二个接口类型:IXMLClinicsType和IXMLClinicType;用二个类(TXMLClinicsType和TXMLClinicType)来执行这二个接口。另外还有三个全局函数:GetClinics (获得根元素),LoadClinics (从外部XML文件加载)和NewClinics (在内存生成新文件)。

用法

使用生成的Clinic.pas单元是很容易的。跟前一篇文章的做法一样,使用XMLDocument组件(在Inernet标签内)。不过我们不再使用无类型节点了,我们可以调用GetClinics函数获得IXMLClinicsType类型。以下是具体操作过程:

在Delphi 6建立一个新的应用(project)

在XML数据绑定向导指引下建立Clinic.pas文件(经过命名存盘 - 译者)

在主窗体上加入一个XMLDocument组件,其FileName属性为Clinic.xml

在主窗体的OnCreate事件中加入以下代码:

procedure TForm1.FormCreate(Sender: TObject);

var

Clinics: IXMLClinicsType;

begin

Clinics := GetClinics(XMLDocument1);

end;

把Clinics变量放到主窗体中是很有用的,这样就可以在主窗体运行期间使用Clinics接口。使用IXMLClinicsType变量类型要比以前使用普通XMLDocument组件方便多了。现在可以通过Get_Clinic方法来获得各个Clinic元素,还可以在特定位置插入新的Clinic元素。用Clinics.Clinic可以获得节点元素,用Getter和Setter方法可以得到或设置元素值。现在可以直接访问No, Title, Date, Topics等属性了:

procedure TForm1.ButtonGetClick(Sender: TObject);

var

Clinic: IXMLClinicType;

begin

Clinic := Clinics.Clinic[0];

EditNo.Text := Clinic.No;

EditTitle.Text := Clinic.Title;

EditDate.Text := Clinic.Date;

EditTopics.Text := Clinic.Topics

end;

可以在Clinic.pas中看到,Getter和Setter是方法而不是属性(实际上,我始终认为使用属性更清楚些)。但是Delphi 6让你看到的却是属性描述而不是方法本身(Delphi 6的另一个受欢迎的优点)。将上面这段代码与前一篇文章使用的方法相比较,就能感到操作方便多了。

下面的例子在XML树的末尾加入一个节点:

procedure TForm1.ButtonAddClick(Sender: TObject);

begin

with Clinics.Add do

begin

No := '2001-2-8; // 8th Clinic of the 2nd series of 2001

Title := 'Special Kylix 2 Clinic';

Date := '2001/12/21';

Topics := 'Kylix 2 New Features'

end

end;

如果没有把XMLDocument组件的AutoSave设置为真,可以用以下方法保存更动结果:

procedure TForm1.FormDestroy(Sender: TObject);

begin

XMLDocument1.SaveToFile;

end;

这就是XML数据绑定向导,一个非常方便的方法。它能做得越来越好。

下一篇文章:

我们已经看到了XML数据绑定的优点。不过好象还有点不“满足”,比方要遍历各个节点,存取节点值(不单单是字符串类型),虽然可用选项决定,但还是用Delphi 6的XML映象更好,它的功能更强。我们将在下一篇文章论述。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有