Delphi 6中的XML数据绑定(XML Data Binding)

本文是三篇论述Delphi   6中XML 功能 系列文章的第二篇,论述Delphi   6中的XML数据绑定(XML   Data   Binding)。   [/b][/blue]    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; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值