`

Delphi 6 XML数据绑定

 
阅读更多

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映象更好,它的功能更强。我们将在下一篇文章论述。

分享到:
评论

相关推荐

    Delphi-JsonToDelphiClass:根据JSON字符串生成Delphi类(Json To Delphi类生成器JSON数据绑定工具)

    就像XML数据绑定一样,但用于JSON。 主要特点: 完全基于RTL构建(无外部依赖项),因此它是跨平台的; 接受任何有效的JSON字符串,无论对象有多复杂; 在树视图中可视化JSON对象的结构; 根据JSON字符串输入生成...

    dOPC Client Toolkit Delphi 10.3 全源码版

    Borland)Delphi和Lazarus环境中使用OPC标准的机会,我们开发了支持最多的OPC软件工具包(SDK,Framework,Toolbox)常见的OPC接口和协议:OPC UA(统一架构),XML DA和经典OPC(数据访问DA,报警和事件AE和历史...

    delphi动态配置DBgrid列显示类

    delphi dbgrid+clientdataSet实现的动态配置dbgrid显示列类,输入一个xml文件,单保存即可把dbgrid中所有列保存到xml中,还可以拖动,修改是否显示,显示宽度。

    Json To Delphi Class Generator / JSON Data Binding Tool

    就像XML数据绑定一样,但适用于JSON。 主要特点: 完全建立在RTL上(没有外部依赖),因此跨平台; 接受任何有效的JSON字符串,无论对象有多复杂; 以树形视图可视化JSON对象的结构; 根据输入的JSON字符串生成...

    Delphi开发范例宝典目录

    实例067 借助绑定控件实现数据选择录入 79 2.5 TListView控件应用典型实例 80 实例068 TListView列表拒绝添加重复信息 80 实例069 将数据库数据添加到TListView控件 82 实例070 用TListView控件制作导航...

    咖啡智能报表控件 2.0.zip

    (下载报表地址、表格数据、报表绑定数据、单元格变量数据、单元格字段数据、操作报表方法等),在XML中的方法可以实现 对本地报表的操作。 报表本身的数据通过HTTP协议上传到服务器上,数据可以是单元格数据、变量...

    DevExpress VCL Full Products V44 (完整源码) 第二包(共2包)

    多种数据模式—ExpressVerticalGrid Suite允许你从传统的数据源(TcxDBVerticalGrid)、非数据库源(TcxVerticalGrid)和定制的数据结构中进行数据绑定。 快速数据加载—ExpressVerticalGrid通过最先用于...

    华报智能报表工具

    另外,华报智能报表工具提供的报表对象都是“数据感知”的,当他们和虚拟数据集中的数据建立“绑定”关系后,可以实时显示数据和感知数据的变化。 1、原理 ReportAll控件/插件是符合微软COM规范的ActiveX控件,运行...

    DevExpress VCL Full Products V44 (完整源码) 第一包(共2包)

    多种数据模式—ExpressVerticalGrid Suite允许你从传统的数据源(TcxDBVerticalGrid)、非数据库源(TcxVerticalGrid)和定制的数据结构中进行数据绑定。 快速数据加载—ExpressVerticalGrid通过最先用于...

    WinTable2.zip

    ·支持开发语言:JSP、ASP、ASP.NET、C#、PHP、ISAPI、  VB、VC++、Delphi、C++Builder、PowerBuilder、Java ·支持脚本:... 通过XML和后台数据库进行绑定 ·内嵌支持脚本语言开发: 使开发更灵活方便

    EtCell报表控件设计工具WinTable 2.8

    ·支持开发语言:JSP、ASP、ASP.NET、C#、PHP、ISAPI、  VB、VC++、Delphi、C++Builder、PowerBuilder、Java ·支持脚本:... 通过XML和后台数据库进行绑定 ·内嵌支持脚本语言开发: 使开发更灵活方便

    易语言程序免安装版下载

    易语言5.1 相对于易语言5.0更新说明: ... 修改XML解析支持库,增加写出CDATA数据功能,解决解析XML时错误的丢弃换行和TAB字符的BUG,解决读取节点值时对CDATA数据进行转义处理的BUG。 20. 修改扩展界面支持库...

    listview改变选中行的字体颜色实例介绍

    目标:选中item,其字体设置为#3197FF,...xml version=”1.0″ encoding=”utf-8″?&gt; &lt;TableLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”wrap_content” andr

    itGrid v2.02

     绑定(OLEDB)和非绑定模式; itCombo特征  新的XP主题支持;  新的CueText和LimitToList属性;  可以在itGrid内或者独立使用;  支持多列;  列样式包括Default, ImageList和OwnerDraw;  ...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    C#微软培训资料

    &lt;&lt;page 1&gt;&gt; page begin==================== 目 目目 目 录 录录 ... 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出了其下一代...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    mapinfo mapx5.0开发指南下

    目 录 欢迎使用... . . . . . . . ....MapInfo MapX 的新增功能 ....关于 MapInfo ....第 1 章: MapX 简介 ....Delphi 速成教学 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....

Global site tag (gtag.js) - Google Analytics