接口操作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.

  

接口操作XML的更多相关文章

  1. 使用dom4j操作XML

    DOM4J介绍 DOM4J是使用Java语言编写的,用于读写及操作XML的一套组件,DOM4J同时具有DOM修改文件的优点和SAX读取快速的优点. DOM4J的使用 首先下载dom4j的JAR包,我用 ...

  2. Strus2第一次课:dom4j操作xml

    先从底层的xml操作技术记录: 当我们新建一个项目,什么架包都没加入的时候,java提供了 org.w3c.dom给我们操作xml里面的元素 import org.w3c.dom.Document; ...

  3. JavaScript操作XML

    JavaScript操作XML (一) JavaScript操作XML是通过XML DOM来完成的.那么什么是XML DOM呢?XML DOM 是: 用于 XML 的标准对象模型 用于 XML 的标准 ...

  4. Delphi操作XML简介

    参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...

  5. VC++中操作XML(MFC、SDK)转

    [转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...

  6. XMl入门介绍及php操作XML

    一.什么是XML XML全称:Extensible Markup Language 中文名:可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型,允许用户对自己的标 ...

  7. C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍

    一. SelectNodes,SelectSingleNode总是返回NULL 下面以一个简单的xml为例: <?xml version="1.0"?> <mes ...

  8. 黄聪:C#操作xml SelectNodes,SelectSingleNode通过 xPath 定位class包含Contains的DIV

    一. SelectNodes,SelectSingleNode总是返回NULL 下面以一个简单的xml为例: <?xml version="1.0"?> <mes ...

  9. 操作xml文档的常用方式

    1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...

随机推荐

  1. 孤陋寡闻了吧?Python 居然可以做这30件神奇好玩的事情(附教程)

    知乎上有个浏览超过400万的问题:可以用 Python 编程语言做哪些神奇好玩的事情? 我先举一个很不专业的栗子...... 然后再找几个人抬一堆例子来...... 不是很稀饭<复联>嘛, ...

  2. 运维开发笔记整理-创建django用户

    运维开发笔记整理-创建django用户 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建普通用户 C:\Users\yinzhengjie\softwares\Pycharm ...

  3. PS批量制作获奖证书并导出PNG

    其实方法和"使用PS批量制作视频字幕"的方法类似.区别在于制作视频字幕时导出成psd格式就可以直接导入Premiere中使用了,而获奖证书考虑到打印设备有无PS的不确定性,可能需要 ...

  4. charles 手机抓包设置

    本文参考:charles 抓包手机 charles经常会进行手机上的网页抓包,比如去copy别人网站图片或脚本的时候o(∩_∩)o : 手机抓包的原理,和PC类似,手机依靠charles与服务端进行对 ...

  5. 基于Java+Selenium的WebUI自动化测试框架(四)-----设置监听类

    基于上一篇的内容,这里我们开始写监听类Listener.我这里写监听类的思路是,继承TestListenerAdapter这个类,然后对其中的方法进行重写.网上也有很多资料,建议先学习一下,然后写出来 ...

  6. linux网络编程之进程间通信介绍

    从今天起,开始学习进程间通信相关的东东,关于socket的编程先告一段落了,在学习进程间通信之前,首先先要了解一些概念,所以,这次不开始真正的代码编写,先纯理论,理解了为之后的更深入的学习可以打下良好 ...

  7. 用来遍历map集合的方法

    map集合是以键值对进行存储值的,所以遍历map集合无非就是获取键和值,根据实际需求,进行获取键和值. 1.无非就是通过map.keySet()获取到值,然后根据键获取到值. for(String s ...

  8. JSOI2012 玄武密码 和 HDU2222 Keywords Search

    玄武密码 给若干模式串和一个文本串.求每个模式串在文本串上能匹配的最大前缀长度. N<=10^7,M<=10^5,每一段文字的长度<=100. jklover的题解 将模式串建成一个 ...

  9. ASP.NET MVC 入门5、View与ViewData

    View建立时有MVC View Page 和 MVC View Content Page两种类型, 前者为标准View, 后者为可继承Master母版页的View. Asp.Net MVC 默认使用 ...

  10. 《SVN的操作流程及规范》

    安装说明: 下载路径:https://tortoisesvn.net/downloads.html 选择对应版本:   安装中文语言包:   右键进入setting设置,选择中文简体.     使用说 ...