码迷,mamicode.com
首页 > Windows程序 > 详细

delphi XML 原来可以玩接口

时间:2015-08-21 19:06:43      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:

以下代码旨在 脱离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

delphi XML 原来可以玩接口

标签:

原文地址:http://www.cnblogs.com/findumars/p/4748693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!