zoukankan      html  css  js  c++  java
  • delphi XML 原来可以玩接口

    以下代码旨在 脱离TXMLDocument 操作 xml

    unit Unit3;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;
    type
      TForm3 = class(TForm)
        XMLDocument1: TXMLDocument;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        Button6: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
      public
      end;
    var
      Form3: TForm3;
    implementation
    uses eng;
    {$R *.dfm}
    procedure TForm3.Button1Click(Sender: TObject);
    var xml:IXMLDocument;root,node,data:IXMLNode;i:Integer;
    //  nt:TNodeType;
    begin
      // 先来个中文版
      xml := NewXMLDocument;   // 默认 1.0
      xml.Options := xml.Options + [doNodeAutoIndent]; // 缩进格式,而不是全在一行
      xml.Encoding :='gb2312'; // 支持中文
      xml.DocumentElement := xml.CreateNode('根节点'); // ntElement 表示节点
      // 一样意思,只能含有一个根节点
    //  xml.AddChild('根节点'); // NameSpaceURI 我理解,不用管,是一个命名空间的路径地址
      root := xml.DocumentElement;
      root.Attributes['说明'] := '怎样不用 TXMLDocument 控件操作 XML文件';
      root.Attributes['版权'] := '归 DuoSoft 所有';
      root.Attributes['i'] := '这里显示i的值';
      i := root.AttributeNodes.IndexOf('版权');
      if i <> -1 then
      begin
        root.AttributeNodes[i].Text := '还是归大家所有吧';
        root.AttributeNodes[i+1].NodeValue := i;
      end;
      node := xml.createElement_x_x_x('tag1','');
      node.Attributes['desc'] := '第1种添加节点方法';
      root.ChildNodes.Add(node);
      node := xml.CreateNode('tag2');
      node.Attributes['desc'] := '第2种添加节点方法';
      root.ChildNodes.Add(node);
      root.AddChild('tag3').Attributes['desc'] := '第3种添加节点方法';
     
      node := xml.CreateNode('备注',ntCData);
      node.Text := '1234'; // 备注 -> 1234
      root.ChildNodes.Add(node);
    
      node := xml.CreateNode('注释',ntComment);
      node.NodeValue := 5678; // 注释 -> 5678
      root.ChildNodes.Add(node);
     
    {  for nt := ntReserved to ntNotation do
      begin
        i := Ord(nt);
        try
          node := xml.CreateNode('type'+IntToStr(i),nt);
          node.Attributes['desc'] := '类型'+IntToStr(i);
          root.ChildNodes.Add(node);
        except
    //      node.Attributes['desc'] := '失败'+IntToStr(i);
          // 各自意义以后再研究★★★★★★★★★★★★★
    //  TNodeType = (ntReserved, ntElement, ntAttribute, ntText, ntCData,
    //    ntEntityRef, ntEntity, ntProcessingInstr, ntComment, ntDocument,
    //    ntDocType, ntDocFragment, ntNotation);
        end;
      end;   }
      data := root.AddChild('数据清单');
      with data.AddChild('record') do
      begin
        Attributes['ID'] := 1;
        Attributes['Name'] := '张三';
        Attributes['sex'] := True;
        Attributes['Salary'] := 12.34;
      end;
      with data.AddChild('record') do
      begin
        Attributes['ID'] := 2;
        Attributes['Name'] := '李四';
        Attributes['sex'] := True;
        Attributes['Salary'] := 5678;
      end;
      with data.AddChild('record') do
      begin
        Attributes['ID'] := 3;
        Attributes['Name'] := '王五';
        Attributes['sex'] := false;
        Attributes['Salary'] := -90.1234;
      end;
      node := root.AddChild('备注');
      node.Attributes[''] := 2010;
      node.Attributes[''] := 7;
      node.Attributes[''] := 12;
      node.Text := '建立了一份迷你表';
    //  node.NodeName := 'NodeName'; // 不可修改
    //  node.NodeValue := 'NodeValue'; // = node.Text
      // 以下代码很有趣!!!尽然合并到一起去了
      node.ChildNodes.Add(xml.CreateNode('再补充一个 ntText',ntText));
      i := node.AttributeNodes.Add(xml.CreateNode('',ntAttribute));
      node.AttributeNodes[i].NodeValue := 16;
      node.AttributeNodes.Add(xml.CreateNode('',ntAttribute));
      node.Attributes[''] := 12;
    //  node.AttributeNodes.Add(xml.CreateNode('秒',xxxx)); // 不支持 ntElement ntText ntComment 等其他类型
    //  node.Attributes['秒'] := '还有秒?';
      xml.SaveToFile(ExtractFilePath(ParamStr(0))+'chn.xml');
    {
    结果如下
      <?xml version="1.0" encoding="gb2312" ?>
    - <根节点 说明="怎样不用 TXMLDocument 控件操作 XML文件" 版权="还是归大家所有吧" i="1">
      <tag1 desc="第1种添加节点方法" />
      <tag2 desc="第2种添加节点方法" />
      <tag3 desc="第3种添加节点方法" />
    - <数据清单>
      <record ID="1" Name="张三" sex="true" Salary="12.34" />
      <record ID="2" Name="李四" sex="true" Salary="5678" />
      <record ID="3" Name="王五" sex="false" Salary="-90.1234" />
      </数据清单>
      <备注 年="2010" 月="7" 日="12" 时="16" 分="12">建立了一份迷你表再补充一个 ntText</备注>
      </根节点>
    }
    end;
    procedure TForm3.Button2Click(Sender: TObject);
    var xml:IXMLDocument;root,node,data:IXMLNode;
    begin
      // 节点变成英文的准备变成 接口
      xml := NewXMLDocument;   // 默认 1.0
      xml.Options := xml.Options + [doNodeAutoIndent]; // 缩进格式,而不是全在一行
      xml.Encoding :='gb2312'; // 支持中文
      root := xml.AddChild('DuoXMLRoot');
      root.Attributes['desc'] := '怎样不用 TXMLDocument 控件操作 XML文件';
      root.Attributes['right'] := '归 DuoSoft 所有';
      node := xml.createElement_x_x_x('tag1','');
      node.Attributes['desc'] := '第1种添加节点方法';
      root.ChildNodes.Add(node);
      node := xml.CreateNode('tag2');
      node.Attributes['desc'] := '第2种添加节点方法';
      root.ChildNodes.Add(node);
      root.AddChild('tag3').Attributes['desc'] := '第3种添加节点方法';
      data := root.AddChild('MyData'); // 注意这个名字,等下会用到
      with data.AddChild('record') do
      begin
        Attributes['ID'] := 1;
        Attributes['Name'] := '张三';
        Attributes['sex'] := True;
        Attributes['Salary'] := 12.34;
      end;
      with data.AddChild('record') do
      begin
        Attributes['ID'] := 2;
        Attributes['Name'] := '李四';
        Attributes['sex'] := True;
        Attributes['Salary'] := 5678;
      end;
      with data.AddChild('record') do
      begin
        Attributes['ID'] := 3;
        Attributes['Name'] := '王五';
        Attributes['sex'] := false;
        Attributes['Salary'] := -90.1234;
      end;
      node := root.AddChild('Memo');
      node.Attributes['yy'] := 2010;
      node.Attributes['mm'] := 7;
      node.Attributes['dd'] := 12;
      node.Text := '建立了一份迷你表';
      xml.SaveToFile(ExtractFilePath(ParamStr(0))+'eng.xml');
    end;

    好了,有一个 eng.xml 接下去还得需要一下 TXMLDocument
    XMLDocument1.FileName 选择 eng.xml
    双击控件打开 wizard
    选择第一个节点,再选择第二个节点。
    把 Document Element Type 勾上
    next finish
    生成一个 eng.pas
    use进来
    接下去的代码如下:直接利用接口的概念操作刚才我们生成的那个 xml

    procedure TForm3.Button3Click(Sender: TObject);
    var dd:IXMLDuoXMLRootType;
      i: Integer;
    begin
      dd := LoadDuoXMLRoot(ExtractFilePath(ParamStr(0))+'eng.xml');
      dd.OwnerDocument.Options := dd.OwnerDocument.Options + [doAutoSave]; // 只要有修改就自动保存
      Memo1.Clear;
      for i := 0 to dd.MyData.Count - 1 do
      begin
        Memo1.Lines.Add('================='+inttostr(i)+'=================');
        Memo1.Lines.Add(IntToStr(dd.MyData[i].ID));
        Memo1.Lines.Add(dd.MyData[i].Name);
        Memo1.Lines.Add(dd.MyData[i].Sex);
        Memo1.Lines.Add(dd.MyData[i].Salary);
        if dd.MyData[i].ID = dd.MyData.Count then
        begin
          ShowMessage('改变最后一个值');
          dd.MyData[i].Salary := '123456789.0'; // 给你加薪
        end;
      end;
    end;
    end.

    参考:http://www.cnblogs.com/key-ok/p/3380867.html

  • 相关阅读:
    循环神经网络(三)-RNN进阶
    卷积神经网络CNN【1】-简介
    tensorflow基础【5】-tensorboard
    强化学习8-时序差分控制离线算法Q-Learning
    POJ 1979 Red and Black 四方向棋盘搜索
    POJ 2386 Lake Counting 八方向棋盘搜索
    Problem A: Assembly Required K路归并
    POJ 2051 Argus 优先队列
    优先队列---使用
    Problem B: Bulbs
  • 原文地址:https://www.cnblogs.com/findumars/p/4748693.html
Copyright © 2011-2022 走看看