分享

把xml当数据库操作

 quasiceo 2014-06-06
 

当操作多个xml文档时,并且每个文档都有自己定义的节点属名,这种在程序中写死的调用方式就很不灵活了。
delphi6.0起提供了把xml当数据库访问控件,使上述问题迎刃而解。
首先要用到XML映象器 xml mapper
XML Mapper 使用示例
首先,将下列文件存为u8格式文件,文件名字为userxml.xml
  <?xml version="1.0" encoding="UTF-8" ?>
- <user-watcher>
- <users>
  <id>900</id>
  <name>111</name>
  <sex>男</sex>
  <birth>1979-8-7</birth>
  <tel>1236547890</tel>
  <addr>tom 大街 8 号</addr>
  <postcode>100018</postcode>
  <email>tom@888.com</email>
  </users>
- <users>
  <id>9007</id>
  <name>tom</name>
  <sex>男</sex>
  <birth>1979-8-7</birth>
  <tel>1236547890</tel>
  <addr>tom 大街 8 号</addr>
  <postcode>100018</postcode>
  <email>tom@888.com</email>
  </users>
- <users>
  <id>90077</id>
  <name>tom</name>
  <sex>男</sex>
  <birth>1979-8-7</birth>
  <tel>1236547890</tel>
  <addr>tom 大街 8 号</addr>
  <postcode>100018</postcode>
  <email>tom@888.com</email>
  </users>
- <users>
  <id>900777</id>
  <name>tom</name>
  <sex>男</sex>
  <birth>1979-8-7</birth>
  <tel>1236547890</tel>
  <addr>tom 大街 8 号</addr>
  <postcode>100018</postcode>
  <email>tom@888.com</email>
  </users>
- <users>
  <id>800</id>
  <name>tom</name>
  <sex>男</sex>
  <birth>1979-8-7</birth>
  <tel>1236547890</tel>
  <addr>tom 大街 8 号</addr>
  <postcode>100018</postcode>
  <email>tom@888.com</email>
  </users>
- <users>
  <id>11</id>
  <name>22</name>
  <sex>33</sex>
  <birth>44</birth>
  <tel>55</tel>
  <addr>66</addr>
  <postcode>77</postcode>
  <email>7777777777777</email>
  </users>
  </user-watcher>
  1,delphi6 tools 启动xmlmapper
  2,file open userxml.xml
  3,在最左面树状列里面单击鼠标右键,选择 select all
  4,选择xml to datapacket
  5,create,datapacket from xml
  6,点击create and test transformation
  7,file,save,transformation,文件名为:ToDp.xtr
  以上是xml到db的过程,只完成了一半,现在还要db to xml
  1,如果没有打开xml mapper,则重复上面1,2,3操作,如果是接着上面操作,则
  2,选择datapacket to xml
  3,create,datapacket from xml
  4,点击create and test transformation
  5,file,save,transformation,文件名为:ToDpIns.xtr
  操作完毕,特别提示,xtr不支持带有中文的注释的xml,所以建议删除注释
TXMLTransformProvider组件通过*.xtr文件将原始XML文件转换到ClientDataSet。
举例来说,在Delphi 6的主窗体上安放一个TXMLTransformProvider(在Data Access标签里)。
将TransformRead属性的TransformationFile子属性设为ToDp.xtr作为数据源。
将XMLDataFile设为userxml.xml文件。
然后安放一个ClientDataSet组件,将它的ProviderName属性设为XMLTransformProvider。
现在可以激活ClientDataSet组件了,它将由XMLTransformProvider提供的数据转换过来。
它的PacketRecords属性值缺省为-1,表示转换全部XML文件。
要显示数据,我们再加入DataSource和DBGrid组件。
将DataSource指向ClientDataSet,DBGrid指向DataSource,就象我们通常使用得那样。
现在可以象使用数据库数据那样使用XML文件里的数据了。
如果对数据进行了修改,可以调用ClientDataSet.ApplyUpdates方法将改动的数据存回XML文件。
但是这样做是不够的。我们还得启动XML映象器,将创建方式由"XML to Datapacket"改为"Datapacket to XML"。
这时如果按下"Create and Test Transformation"键,然后将转换结果存为ToDpIns.xtr文件。
现在,将TXMLTransformationProvider的TransformationWrite属性中的子属性TransformationFile设为ToDpIns.xtr文件。
最后在主窗体的OnClose事件中加上存盘指令:
ClientDataSet1.ApplyUpdates(-1)
程序退出之前会将作出的数据修改存回XML文件。
示例源程序:
unit XMLProvider;
//----------------------------------------------------------------------------
//本实例演示
//1,XML mapper 的简单使用
//2,XML 当作数据库操作的填加,删除,修改(替换),保存等操作
//作者:cactus123456@hotmail.com
//日期:2005.11.15
//版本:1.0
//----------------------------------------------------------------------------
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, ExtCtrls, DB, DBClient, Provider, xmldom,
  Xmlxform, DBCtrls;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    DBGrid1: TDBGrid;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    ClientDataSet1: TClientDataSet;
    DataSource1: TDataSource;
    Label3: TLabel;
    XMLTransformProvider1: TXMLTransformProvider;
    Button3: TButton;
    Edit1: TEdit;
    DBNavigator1: TDBNavigator;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
   ClientDataSet1.Active:= false;
   ClientDataSet1.Active:= true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientDataSet1.ApplyUpdates(1);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
  ClientDataSet1.SaveToFile(Edit1.Text, dfXML);
end;
end.
对应的form文件
object Form1: TForm1
  Left = 299
  Top = 141
  AutoScroll = False
  Caption = 'TXMLTransformProvider'
  ClientHeight = 519
  ClientWidth = 646
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -10
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 646
    Height = 519
    Align = alClient
    TabOrder = 0
    object Label1: TLabel
      Left = 20
      Top = 43
      Width = 280
      Height = 16
      HelpType = htKeyword
      Caption = 'Views and updates the Xml-Document ''pos.xml'''
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -15
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      ParentFont = False
    end
    object Label3: TLabel
      Left = 20
      Top = 13
      Width = 340
      Height = 20
      HelpType = htKeyword
      Caption = 'Example of using TXMLTransformProvider '
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -16
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      ParentFont = False
    end
    object DBGrid1: TDBGrid
      Left = 16
      Top = 330
      Width = 609
      Height = 169
      DataSource = DataSource1
      TabOrder = 0
      TitleFont.Charset = DEFAULT_CHARSET
      TitleFont.Color = clWindowText
      TitleFont.Height = -10
      TitleFont.Name = 'MS Sans Serif'
      TitleFont.Style = []
    end
    object Button1: TButton
      Left = 15
      Top = 291
      Width = 90
      Height = 30
      Caption = 'Get data'
      TabOrder = 1
      OnClick = Button1Click
    end
    object Button2: TButton
      Left = 126
      Top = 291
      Width = 121
      Height = 30
      Caption = 'Apply Updates'
      TabOrder = 2
      OnClick = Button2Click
    end
    object Memo1: TMemo
      Left = 16
      Top = 66
      Width = 609
      Height = 183
      Lines.Strings = (
        'TXMLTransformProvider transforms a generic xml-document into a'
        'Datapacket.'
          'Data aware controls such as DBGrids,  XMLBroker( Internet Expres' +
          's)  etc. '
          'can now be used to display, browse  and update the data from the' +
          'se documents.'
          'The updated data can then be resolved back to the original xml-d' +
          'ocument.'
        'TXMLTransformProvider  description:'
        'XMLDataFile:'
        'Points to the generic xml-file  '
        'TransformRead.TransformationFile:'
          'Points to the transformation file (''.xtr'')  for ''Xml to Datapack' +
          'et''.'
        'Created by ''XmlMapper''.'
        'TransformWrite.TransformationFile:'
        'Points to the transformation file for ''Datapacket to Xml''.'
        'CacheData :'
        'Set property to cache the ''transformed'' Xml file.'
        'Events:'
        'TransformRead.OnTranslate'
        'TransformWrite.OnTranslate:'
          'Used to intercept and translate field-values marked as ''Userdefi' +
          'ned''  in XmlMapper.'
          'Note: When writing back updates to the xml-file the file is recr' +
          'eated and '
          'rewritten, so when creating the transformations all data-fields ' +
          'should be mapped '
        'to avoid data-loss.'
          'Note: As is the case with ClientDatasets, this technology limits' +
          ' data-size'
        'to available memory and is not intended for ''huge'' xml-files.')
      ScrollBars = ssBoth
      TabOrder = 3
    end
    object Button3: TButton
      Left = 352
      Top = 291
      Width = 65
      Height = 30
      Caption = 'Save'
      TabOrder = 4
      OnClick = Button3Click
    end
    object Edit1: TEdit
      Left = 440
      Top = 291
      Width = 185
      Height = 21
      TabOrder = 5
      Text = 'DemoTest.xml'
    end
    object DBNavigator1: TDBNavigator
      Left = 16
      Top = 258
      Width = 610
      Height = 25
      DataSource = DataSource1
      TabOrder = 6
    end
  end
  object ClientDataSet1: TClientDataSet
    Aggregates = <>
    Params = <>
    ProviderName = 'XMLTransformProvider1'
    Left = 432
    Top = 360
  end
  object DataSource1: TDataSource
    DataSet = ClientDataSet1
    Left = 480
    Top = 360
  end
  object XMLTransformProvider1: TXMLTransformProvider
    TransformRead.TransformationFile = 'ToDp.xtr'
    TransformWrite.TransformationFile = 'ToDpIns.xtr'
    XMLDataFile = 'userxml.xml'
    Left = 368
    Top = 360
  end
end



ds1:TClientdataset;

ds1.Active := False;
  //ds1.FileName := 'http://210.30.185.211:8080/his/bbb.xml';
  //ds1.FileName := 'd:\bbb.xml';
  //
  ds1.XMLData := '<?xml version="1.0" standalone="yes"?>'
    +'<DATAPACKET Version="2.0">'
      +'<METADATA> '
      + ' <FIELDS>    '
      + '   <FIELD attrname="Name" fieldtype="string" WIDTH="200"/>  '
      + '   <FIELD attrname="Capital" fieldtype="string" WIDTH="12"/> '
      + '   <FIELD attrname="Continent" fieldtype="string" WIDTH="13"/> '
     +  '   <FIELD attrname="Area" fieldtype="string" WIDTH="7"/>     '
     +   '  <FIELD attrname="Population" fieldtype="string" WIDTH="8"/>  '
     +  ' </FIELDS>'
     + '  <PARAMS/>   '
    + ' </METADATA>  '
   +  ' <ROWDATA>    '
    +    '<ROW Name="Argentina" Capital="Buenos Aires" Continent="South America" Area="2777815" Population="32300003"/>  '
     +    '    <ROW Name="abc" Capital="ffff" Continent="South America" Area="2777815" Population="32300003"/>  '
      +     '    <ROW Name="vv" Capital="ggggg" Continent="South America" Area="2777815" Population="32300aa1"/> '
       +     '    <ROW Name="dd" Capital="ttt" Continent="South America" Area="2777815" Population="323000112"/>  '
     + '</ROWDATA> '
  + ' </DATAPACKET>';
  ds1.Active := True;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多