当操作多个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