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

时间: 2024-08-12 23:58:23

delphi XML 原来可以玩接口的相关文章

MyBatis xml和dao层接口组合使用

在这里,不再介绍Mybatis的配置. mybatis可以用xml进行数据操作,也可以在dao层用注解的方式,也可以采取xml和dao层接口组合使用的方法.显然 ,后者更加简单. 实体类Student package com.zhao.entity; /** * * @author: zhao * @time: 2016年5月31日 * * @description:学生 */ public class Student { private int stuId; private String st

攻占SSM之手写Mybatis的xml实现Dao层接口

上午写了一个简单的 从xml读取信息实例化一个Bean对象.下午就开始想mybatis是怎么通过xml文件来实现dao层接口的,一开始想直接用Class.forName(String name)然后调用getMethods的办法来得到Dao接口所有的方法Method,结果证明这对接口实没有用的,会报一个错误.于是想百度,但是百度的结果全是怎么配置mapper的..然后我又四处翻资料,终于找到一些办法.最后我还是用到了我自己封装的DButil 和 DataUtil两个类. 反正我是这么实现的,至于

用soapUI测试xml格式的HTTP接口

有些HTTP接口是直接传递parameter的,有些HTTP请求是将parameter转换为xml串进行传递的.现在要分享的就是如何用soapUI实现xml串的HTTP接口测试. 工具/原料 soapUI 方法/步骤 1 新建soapUI工程:右击左侧导航面板中的工作空间节点"Project",选择"New soapUI Project",输入工程名称,点击OK 2 新建TestSuite:右击工程名,选择"New Testsuite"   新建

一个关于Delphi XML处理单元的BUG

使用delphi的XML处理单元 XMLDoc XMLIntf 在获取XML文本内容的时候, 高版本的Delphi会丢失编码描述....在D7上却是正常的, 下面是测试源码: procedure TForm1.Button1Click(Sender: TObject); var nXMLDoc: IXMLDocument; i: Integer; nMS: TMemoryStream; nSS: TStringStream; nStr: string; begin nXMLDoc := TXML

Delphi webservice wsdl 向导 生成接口文件的方法

在delphi 7 中,在webservice 页有 wsdl 接口导入接口向导,帮助程序员生成 webserviuce 接口单元, 但在我所使用的  delphi 2007-Delphixe6 这些版本中,不知为何没有该向导. 解决办法是:执行 C:\Program Files\Embarcadero\RAD Studio\8.0\bin\WSDLImp.exe,让它为我们生成接口单元. 例如在命令行执行: C:\Program Files\Embarcadero\RAD Studio\8.0

Mybatis 两个xml绑定同一个Mapper接口时, 二级缓存没有正确刷新的问题!

如下图所示: 我有两个xml文件, 他们有着相同的 namespace (指向 IssueMapper) 为了启用二级缓存, 我在 IssueMapper.xml 中添加了 <cache /> 节点 (不能在两个xml中同时添加, 否则启动时会报错) 看一眼 Mapper接口, 只有两个接口 其中 findOne() 在 IssueMapper.xml 中实现, 而 update 在 IssueMapperExt.xml 中实现 现在使用如下步骤调用 正常来说, 执行了 update 操作后,

delphi XML简单处理

unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Xml.XMLDoc, Xml.xmldom, Xml.XMLIntf, Vcl.StdCtrls; type TForm1 = class(TForm) Memo1: TMe

delphi操作xml学习笔记 之一 入门必读

Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocument把XML文档读到内存中,从而可以进行编辑.保存操作.TXMLDocument类是通过DOM(文档对象模型)接口来访问XML文档中的各个元素的.对于DOM接口的实现有多种方式,Delphi支持的方式有:1)微软的MSXML SDK,这种方式是通过COM对象来实现:2) Apache 的Xerces的实现方式

delphi中的XML解析控件TXMLDocument的用法

Delphi中TXMLDocument控件的用法 Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,现称述于下面. 在讲之前先给出一个XML实例,在讲某些部分是要结合实例比较容易理解. 1<?xmlversion="1.0"encoding="gb2312"?><!--文档版本信息,注释格式同HTML--> 2<XMLPackage> 3<clinetinfoip=”202.1