作者: cactus123456 标题: delphi操作xml学习笔记 之四 简单增删查改 关键字: AppendChild insertBefore removeChild replaceChild 分类: 个人专区 密级: 公开 xml基础操作实例,因为刚开始学,如果有不对的地方,请批评指正,代码如下: unit XMLOptionUnit; //============================================================================== //本实例演示 //1,XML 创建,打开,关闭操作 //2,XML 填加,添加到指定位置,删除,修改(替换),查找等操作 //作者:cactus123456@hotmail.com //日期:2005.9.23 //版本:1.0 //============================================================================== interface uses SysUtils,ActiveX,MSXML2_TLB; type RecUser=Record U_Id :widestring; U_Name :widestring; U_Sex :widestring; U_Birth :widestring; U_Tel :widestring; U_Addr :widestring; U_PostCode :widestring; U_Email :widestring; end; type TXMLOption=class private FActive :boolean; FFilename: string; FXMLDoc :IXMLDOMDocument; //填加一个子节点 procedure AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string); public procedure CreateBlank(Filename: string); procedure OpenXml(Filename: string); procedure CloseXml; procedure AppendUser(muser:RecUser); procedure InsertUser(uid:string;muser:RecUser); procedure RemoveUser(uid:string); procedure ReplaceUser(uid:string;newuser:RecUser); function FindUser(userid:widestring):boolean; function GetNodeLength(node:widestring):integer; end; implementation const XMLTag = 'xml'; XMLPrologAttrs = 'version="1.0" encoding="UTF-8"'; XMLComment = '简单XML文档操作用户实例'#13 + '用户结构为序号,姓名,性别,出生年月日,电话,住址,邮编,电邮'#13 + '作者 cactus123456@hotmail.com, 2005.9.21'; UserWatcherTag = 'user-watcher'; XMLComment2 = '创建文档时间:'; UsersTag = 'users'; U_Id = 'id'; U_Name = 'name'; U_Sex = 'sex'; U_Birth = 'birth'; U_Tel = 'tel'; U_Addr = 'addr'; U_PostCode = 'postcode'; U_Email = 'email'; //创建一个空XML,如果这个Filename文件已经存在,则覆盖 procedure TXMLOption.CreateBlank(Filename: string); begin FActive:=false; FFilename:=''; try FXMLDoc := CoDOMDocument.Create; FXMLDoc.AppendChild(FXMLDoc.CreateProcessingInstruction(XMLTag, XMLPrologAttrs)); FXMLDoc.AppendChild(FXMLDoc.CreateComment(XMLComment)); FXMLDoc.AppendChild(FXMLDoc.CreateElement(UserWatcherTag)); FXMLDoc.AppendChild(FXMLDoc.CreateComment(XMLComment2+datetimetostr(now))); FXMLDoc.save(Filename); FFilename:=Filename; FActive:=true; except FXMLDoc:=nil; end; end; //打开一个存在的Filename XML文档 procedure TXMLOption.OpenXml(Filename: string); begin if not Assigned(FXMLDoc) then begin FXMLDoc := CoDOMDocument.Create; if FXMLDoc.Load(Filename) then FActive:=true else FActive:=false; if FActive then FFilename:=Filename else FFilename:=''; end; end; //关闭一个打开的XML文档 procedure TXMLOption.CloseXml; begin if Assigned(FXMLDoc) then FXMLDoc:=nil; FFilename:=''; FActive:=false; end; procedure TXMLOption.AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string); var Internal: IXMLDOMElement; begin Internal:=IXMLDOMElement(Parent.AppendChild(FXMLDoc.CreateElement(Field))); Internal.AppendChild(FXMLDoc.CreateTextNode(Value)); end; //填加一个节点到后面 procedure TXMLOption.AppendUser(muser:RecUser); var xuser:IXMLDOMElement; xroot:IXMLDOMElement; begin if FActive then begin xroot:=FXMLDoc.documentElement; xuser :=IXMLDOMElement(xroot.AppendChild(FXMLDoc.CreateElement(UsersTag))); AddSimpleElement(xuser,U_Id,muser.U_Id); AddSimpleElement(xuser,U_Name,muser.U_Name); AddSimpleElement(xuser,U_Sex,muser.U_Sex); AddSimpleElement(xuser,U_Birth,muser.U_Birth); AddSimpleElement(xuser,U_Tel,muser.U_Tel); AddSimpleElement(xuser,U_Addr,muser.U_Addr); AddSimpleElement(xuser,U_PostCode,muser.U_PostCode); AddSimpleElement(xuser,U_Email,muser.U_Email); FXMLDoc.save(FFilename); end; end; procedure TXMLOption.InsertUser(uid:string;muser:RecUser); var xfind:IXMLDOMNode; xuser:IXMLDOMElement; xroot:IXMLDOMElement; xpath:string; begin if not FActive then exit; xpath:=UsersTag+'['+U_Id+'="'+uid+'"]'; xfind:=FXMLDoc.documentElement.selectSingleNode(xpath); //如果没有找到, xfind=nil 则在文件的末尾插入 //如果找到,xfind<>nil 则在找到的纪录前面插入 xroot:=FXMLDoc.documentElement; xuser :=IXMLDOMElement(xroot.insertBefore(FXMLDoc.CreateElement(UsersTag),xfind)); AddSimpleElement(xuser,U_Id,muser.U_Id); AddSimpleElement(xuser,U_Name,muser.U_Name); AddSimpleElement(xuser,U_Sex,muser.U_Sex); AddSimpleElement(xuser,U_Birth,muser.U_Birth); AddSimpleElement(xuser,U_Tel,muser.U_Tel); AddSimpleElement(xuser,U_Addr,muser.U_Addr); AddSimpleElement(xuser,U_PostCode,muser.U_PostCode); AddSimpleElement(xuser,U_Email,muser.U_Email); FXMLDoc.save(FFilename); end; procedure TXMLOption.RemoveUser(uid:string); var xfind:IXMLDOMNode; xroot:IXMLDOMElement; xpath:string; begin if not FActive then exit; xpath:=UsersTag+'['+U_Id+'="'+uid+'"]'; xfind:=FXMLDoc.documentElement.selectSingleNode(xpath); if xfind<>nil then begin xroot:=FXMLDoc.documentElement; xroot.removeChild(xfind); FXMLDoc.save(FFilename); end; end; procedure TXMLOption.ReplaceUser(uid:string;newuser:RecUser); var xfind,newnode:IXMLDOMNode; xroot:IXMLDOMElement; xpath:string; begin if not FActive then exit; xpath:=UsersTag+'['+U_Id+'="'+uid+'"]'; xfind:=FXMLDoc.documentElement.selectSingleNode(xpath); //如果没有找到,则不做替换 if xfind<>nil then begin newnode:=xfind.cloneNode(true); newnode.selectSingleNode(U_Id).text:=newuser.U_Id; newnode.selectSingleNode(U_Name).text:=newuser.U_Name; newnode.selectSingleNode(U_Sex).text:=newuser.U_Sex; newnode.selectSingleNode(U_Birth).text:=newuser.U_Birth; newnode.selectSingleNode(U_Tel).text:=newuser.U_Tel; newnode.selectSingleNode(U_Addr).text:=newuser.U_Addr; newnode.selectSingleNode(U_PostCode).text:=newuser.U_PostCode; newnode.selectSingleNode(U_Email).text:=newuser.U_Email; xroot:=FXMLDoc.documentElement; xroot.replaceChild(newnode,xfind); FXMLDoc.save(FFilename); end; end; function TXMLOption.FindUser(userid:widestring):boolean; var xuser:IXMLDOMNode; xpath:string; begin result:=false; if not FActive then exit; //关于xpath语法说明,参见www./TR/xpath xpath:=UsersTag+'['+U_Id+'="'+userid+'"]'; xuser:=FXMLDoc.documentElement.selectSingleNode(xpath); if xuser<>nil then result:=true; end; function TXMLOption.GetNodeLength(node:widestring):integer; var xNode:IXMLDOMNodeList; xroot:IXMLDOMElement; xpath:widestring; begin result:=0; xpath:=node; try xroot:=FXMLDoc.documentElement; xNode:=xroot.selectNodes(xpath); result:=xNode.length; except end; end; initialization { Initialise COM } CoInitialize(nil); finalization { Tidy up } CoUninitialize(); end. 调用上面单元的实例的代码,unit单元: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,XMLOptionUnit, OleCtrls, SHDocVw; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Button3: TButton; Button4: TButton; Button5: TButton; WebBrowser1: TWebBrowser; Label1: TLabel; Button6: TButton; Button7: TButton; Button8: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); private { Private declarations } FXMLOption:TXMLOption; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FXMLOption:=TXMLOption.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin FXMLOption.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin FXMLOption.CreateBlank(edit1.Text); end; procedure TForm1.Button2Click(Sender: TObject); var auser:RecUser; begin auser.U_Id:=edit2.Text; auser.U_Name:='tom'; auser.U_Sex:='男'; auser.U_Birth:='1979-8-7'; auser.U_Tel:='1236547890'; auser.U_Addr:='tom 大街 8 号'; auser.U_PostCode:='100018'; auser.U_Email:='tom@888.com'; FXMLOption.AppendUser(auser); WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text); end; procedure TForm1.Button3Click(Sender: TObject); begin FXMLOption.OpenXml(edit1.Text); WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text); end; procedure TForm1.Button4Click(Sender: TObject); begin FXMLOption.CloseXml; WebBrowser1.Navigate('about:blank'); end; procedure TForm1.Button5Click(Sender: TObject); begin if FXMLOption.FindUser(edit2.text) then label1.Caption:='true' else label1.Caption:='false'; end; procedure TForm1.Button6Click(Sender: TObject); var auser:RecUser; begin auser.U_Id:=edit2.Text; auser.U_Name:='peter'; auser.U_Sex:='女'; auser.U_Birth:='1980-8-7'; auser.U_Tel:='36-3654-7890'; auser.U_Addr:='peter 大街 8 号'; auser.U_PostCode:='100018'; auser.U_Email:='peter@888.com'; FXMLOption.InsertUser(edit2.text,auser); WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text); end; procedure TForm1.Button7Click(Sender: TObject); begin FXMLOption.RemoveUser(edit2.text); WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text); end; procedure TForm1.Button8Click(Sender: TObject); var auser:RecUser; begin auser.U_Id:=edit2.Text; auser.U_Name:='张三'; auser.U_Sex:='男'; auser.U_Birth:='1970-8-7'; auser.U_Tel:='001654-7890'; auser.U_Addr:='张三 大街 8 号'; auser.U_PostCode:='100018'; auser.U_Email:='zhangsan@888.com'; FXMLOption.ReplaceUser(edit2.Text,auser); WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text); end; end. |
|