网站建设| 数据库类| 图形图象| 程序设计| 现代办公| 操作系统| 考试认证| 网络技术| 软件工程| 电脑相关| 文学作品
网站开发| 网页制作| 操作系统| 图象图形| 考试认证| 数据库类| 程序设计| 硬件技术| 现代办公| 网络技术| 笑话频道
 
您的位置: 电脑书库首页-> 电脑文摘-> 程序设计-> Delphi/Pascal-> XML数据绑定

XML数据绑定
作者:佚名 来源:InterNet 加入时间:2004-11-25
相关文章
  • XML和现代CGI应用程序
  • 用VB.NET和XPath简化XML导航
  • 将Recordset作为XML保存
  • 使用XMLHTTP发送超长XML表单数据
  • xml中的空格之完全解说
  • XML数据库中几个容易混淆的概念
  • 利用XML开发留言板简单的例子
  • 使用JavaScript访问XML数据
  • Delphi6中XML文档的应用
  • XML文件编程
  • 相关书籍:
  • Java与XML数据绑定
  • 使用Java技术的XML高级开发
  • XML高级编程完整版
  • XML 初学进阶
  • XML轻松学习手册
  • 无废话XML
  • XML实用大全1-18章
  • XML学习指南
  • XML高级编程
  • ASP.NET-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映象更好,它的功能更强。我们将在下一篇文章论述。



    [文章录入员:fightter]

    相关文章
  • XML和现代CGI应用程序
  • 用VB.NET和XPath简化XML导航
  • 将Recordset作为XML保存
  • 使用XMLHTTP发送超长XML表单数据
  • xml中的空格之完全解说
  • XML数据库中几个容易混淆的概念
  • 利用XML开发留言板简单的例子
  • 使用JavaScript访问XML数据
  • Delphi6中XML文档的应用
  • XML文件编程
  • 相关书籍:
  • Java与XML数据绑定
  • 使用Java技术的XML高级开发
  • XML高级编程完整版
  • XML 初学进阶
  • XML轻松学习手册
  • 无废话XML
  • XML实用大全1-18章
  • XML学习指南
  • XML高级编程
  • ASP.NET-XML深入编程技术
  • 本站推荐内容

    近期主机类热搜关键词:
    美国服务器 美国服务器租用 海外服务器租用 国外服务器租用

    Delphi/Pascal
    C/C++/VC
    C++Builder
    Basic/VB类
    Delphi/Pascal
    Java编程
    FORTRAN
    其它
    电脑教程阅读排行
    ·DELPHI下的多线程程序设计(...
    ·Delphi与Excel的亲密接...
    ·Delphi实现串口通信的常用的...
    ·Delphi中初始化.Ini文件...
    ·Delphi中用于读写(I/O)...
    ·谈谈Delphi中的类和对象
    ·Delphi编译错误中文手册
    ·Delphi中关于TApplic...
    ·OPENGL图形程序设计
    ·SQL的基本操作