zoukankan      html  css  js  c++  java
  • delphi 操作xml示例(DelphiBBS)

    自:http://www.delphibbs.com/keylife/iblog_show.asp?xid=20713
    ================================================================
    2005-9-23 21:05:34    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;
      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.w3.org/TR/xpath
      xpath:=UsersTag+'['+U_Id+'="'+userid+'"]';
      xuser:=FXMLDoc.documentElement.selectSingleNode(xpath);
      if xuser<>nil then result:=true;
    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.
    
    Unit单元对应的Form:
    
    object Form1: TForm1
      Left = 192
      Top = 107
      Width = 696
      Height = 480
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      OnDestroy = FormDestroy
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 440
        Top = 400
        Width = 32
        Height = 13
        Caption = 'Label1'
      end
      object Button1: TButton
        Left = 256
        Top = 360
        Width = 75
        Height = 25
        Caption = 'CreateBlank'
        TabOrder = 0
        OnClick = Button1Click
      end
      object Button2: TButton
        Left = 352
        Top = 360
        Width = 75
        Height = 25
        Caption = 'AddUser'
        TabOrder = 1
        OnClick = Button2Click
      end
      object Edit1: TEdit
        Left = 208
        Top = 328
        Width = 121
        Height = 21
        TabOrder = 2
        Text = 'userxml.xml'
      end
      object Edit2: TEdit
        Left = 352
        Top = 328
        Width = 121
        Height = 21
        TabOrder = 3
        Text = '900'
      end
      object Button3: TButton
        Left = 256
        Top = 384
        Width = 75
        Height = 25
        Caption = 'OpenXml'
        TabOrder = 4
        OnClick = Button3Click
      end
      object Button4: TButton
        Left = 256
        Top = 408
        Width = 75
        Height = 25
        Caption = 'CloseXml'
        TabOrder = 5
        OnClick = Button4Click
      end
      object Button5: TButton
        Left = 352
        Top = 392
        Width = 75
        Height = 25
        Caption = 'FindUser'
        TabOrder = 6
        OnClick = Button5Click
      end
      object WebBrowser1: TWebBrowser
        Left = 0
        Top = 0
        Width = 688
        Height = 313
        Align = alTop
        TabOrder = 7
        ControlData = {
          4C0000001B470000592000000000000000000000000000000000000000000000
          000000004C000000000000000000000001000000E0D057007335CF11AE690800
          2B2E126208000000000000004C0000000114020000000000C000000000000046
          8000000000000000000000000000000000000000000000000000000000000000
          00000000000000000100000000000000000000000000000000000000}
      end
      object Button6: TButton
        Left = 432
        Top = 360
        Width = 75
        Height = 25
        Caption = 'InsertUser'
        TabOrder = 8
        OnClick = Button6Click
      end
      object Button7: TButton
        Left = 512
        Top = 360
        Width = 75
        Height = 25
        Caption = 'RemoveUser'
        TabOrder = 9
        OnClick = Button7Click
      end
      object Button8: TButton
        Left = 512
        Top = 392
        Width = 75
        Height = 25
        Caption = 'ReplaceUser'
        TabOrder = 10
        OnClick = Button8Click
      end
    end 

    http://blog.csdn.net/genispan/article/details/4364492

    以上XPATH有误 应改为:
    xpath:=UsersTag '[@' U_Id '=&quot;' userid '&quot;]';

  • 相关阅读:
    openresty开发系列35--openresty执行流程之5内容content阶段
    openresty开发系列34--openresty执行流程之4访问阶段
    openresty开发系列33--openresty执行流程之3重写rewrite和重定向
    [转] Dangers of using dlsym() with RTLD_NEXT
    fork failed because of Out Of Memory
    gdb 拾穗
    原子变量的性能问题
    blktrace + blkparse + btt 分析IO
    [转] 利用BLKTRACE分析IO性能
    使用perf + FlameGraph生成进程火焰图
  • 原文地址:https://www.cnblogs.com/findumars/p/7117030.html
Copyright © 2011-2022 走看看