Delphi 中 txmldocument 控件的用法
Delphi 中对 xml 文件的解析做的很好 , 比直接使用 ms 的 msxml2_tlb 中的接口要方便很多 , 现称述于下面。
在讲之前先给出一个 xml 实例 , 在讲某些部分是要结合实例比较容易理解。
1 <? Xml Version = "1.0" encoding = "GB2312"?> <!-文档版本信息, 注释格式同 html->
2 <xmlPackage>
3 <ClinetInfo ip = ”202.101.
4 <Data>
5 <row id = "
6 <row id = "
7 <!-Data 中包含了元素 baris 的两个实例 , 通过属性 id 予以区分->
8 </data>
9 <memo length = "
10 <action acition = ”update/inert”/> <!-该元素描述了一动作控制信息->
11 </xmlPackage>
Txmldocument 控件提供了我们两种常用做法 : 一、直接用这个类封装的属性和方法来读写 xml 文件 , 我把它称为自己解析法;二、用控件提供的 wizard pengikat data xml 来创建一个适合用户自己的接口单元 , 然后按照这个接口单元提供的许多接口来实现对同类 xml 文件的读写 , 十分方便 , 但有局限性 , 我把它称为控件解析法。我重点讲第一种使用方法。
一、自己解析法 :
下面我将按创建、读取、修改、添加和删除这五个动作来分三类讲述。
( 1 )创建和添加 :
首先要创建 xml 实例 , : :
Txmldocument.create ('f:/work/费亚的文件 /task/xml/lab_xml/country.xml');
也可以这样动态创建 :
Xml: = txmldocument.create (nil);
Xml. LoadFromFile ('f:/work/费亚的文件 /task/xml/lab_xml/country.xml');
当然也可以从 Internet 面板上拖放一个 TxMldocument 控件 , 然后再为 nama file 或 xml 属性赋值 , 比如对象名仍然叫 xml (下都不说明都这样默认) :
Xml.filename: = f:/work/费亚的文件 /task/xml/lab_xml/country.xml;
至于它的另一个属性 xml 是用来直接赋 xml 语言 , 这个用法对我们暂不重要。创建完 xml 实例后要注意打开 aktif 属性 :
Xml.active: = true;
这样下面对文件的读写操作才有效。如果没有 xml 文件可以用来创建 xml 的实例 , 即要建立 xml 文件 , 可以选择在上面一句之后 , 对 xml 实例操作 , : :
Xml.savetofile ('f:/work/费亚的文件 /task/xml/lab_xml/country.xml');
下面就是创建节点了 , 需要结合上面的 xml 文件实例来讲述。首先一个 xml 文件只能有一个根节点 , 比如文件实例中 2 行的 xmlpackage 是这样被创建的 :
Var rootnode: xmlnode;
Rootnode: = xml.createNode ('xmlpackage');
Xml. DocumentElement: = rootnode;
接着我们创建不同类型的子节点 , 前面的实例中的第 9 行的节点比较有代表性 , 它是一个带有文本的子节点 , 同时又带有两个属性节点 , 我们来看看它是怎么被创建的 , : :
xml.active: = true;
xml.documentElement: = xml.createNode ('xmlpacage');
接着我们创建 Memo 子节点 :
Var node: ixmlnode;
node: = xml.createNode ('memo');
xml.documentelement.childnodes.add (node);
这种创建儿子节点的方法比较好 , 当然还可以:
xml.documentelement.addchild ('xmlpacage');
来创建 , 建议使用第一种 , CreateNode 方法的用法是很丰富的 , 主要看它的第二个参数 , 上面其实是用了默认参数 , :
node.childnodes.add (xml.createNode ('Halo! I Am Yaya!', nttext));
注意 CreateNode 方法的第二个参数 , : :
node.attributeNodes.add (xml.createNode ('panjang', ntattribute));
node.setAttribute ('length', 16);
node.attributeNodes.add (xml.createNode ('warna', ntattribute));
node.setAttribute ('color', $ 0034494b);
最后别忘了保存哦 :
xml.savetofile ('f:/work/费亚的文件 /task/xml/lab_xml/test.xml');
xml.active: = false;
到此我们就结束了创建 , 至于添加 , 即插入节点 , 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 要插在指定节点后将上面的 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , index: integer; const node: ixmlnode), 其它用法也就一目了然 , 不再详述了。
(2 )读取和修改
读取比较简单 , 主要是读取子节点的文本和属性值 , 方法是比较简单 , 关键就是要利用 ixmlnodelist 接口来提供的一些属性和方法来循环搜索到指定节点就 ok 了。文本和属性值的读取方法在 delphi 中提供的方法有很多 , 我就讲一种 : Nodevalue 属性 , 它是 Ixmlnode 接口的一个属性 , 它的值是 olevariant 类型 , 意味着我们在 意味着我们在 xml 文件里虽然都是存的字符串, 但 delphi 会帮我们来转换数据格式 , 比如有个属性节点叫 simpul :
Node.nodevalue: = 16; // 16 是 integer 类型
虽然在 xml 文件中保存的是 ascii 格式的 16 , 但当我们要读取的时候 delphi 还会帮我们换回来的 , :
Var Len: Integer;
Len: = node.nodevalue;
当然我们要注意的就是 , 用这种方法读取的时候最好先查看同一节点的 nodetype 属性 , 因为有几种类型的节点避免发生异常 , : :
Nodetype | Nodevalue |
ntattribute 属性节点 | 属性的值 |
ntelement 元素节点 | 如果这个节点没有子节点 , 就返回它的 teks , 否则有异常 |
nttext 文本节点 | Teks 的内容 |
上面讲的都是读和写节点的值 , 有时候也要读和写节点名 , 就要访问 nodename 属性 , 使用方法大概相同 , 也要结合 nodevalue : :
Nodetype | Nodename |
ntattribute 属性节点 | 属性的名字 |
ntelement 元素节点 | 节点的名字 |
nttext 文本节点 | '#teks' |
读取就完了 , 当然我们上面是通过接口的属性来做的 , 接口也有方法来完成 , 就不说了 , 对上面的几个属性都是可读可写的 , 所以修改也基本清楚了。
(3 )删除
删除主要给出了删除指定节点 , 主要是看 ixmlnodelist 接口的几个方法 , jelas 和 hapus 方法 , 其中前一个是全部清空 , 后一个是删除指定的子节点 , 这个方法是重载的 , ,也可以按顺序号 , Hitung 属性 , ,
二、控件解析法 :
为控件的 Nama file 属性选择一个 xml 样板文件 , 然后由击控件选择 XML data pengikat data… , 在这个向导中间会创建一个 xdb 文件。在弹出的向导中 , 第一页中 , 可以看到 delphi 已经帮你把 xml 文件中的各个节点对应到了接口 , 这里你可以展开每个节点 , 编辑每个节点的属性数据类型。单击 berikutnya 到下一个配置页面 , 这里你可以看到 delphi 生成了各个节点接口的框架代码。 单击 finsh 完成向导 , 这样 delphi 将生成一个 xdb 文件和与该 xml 文档结构对应的 xml 接口单元。再以后访问该类 xml 文件时 , 只需要参照生成的 xml 接口单元里的方法和属性就能很方便的读取节点 :
var xml: ixmlxmlPackAgetype; // 通过向导生成的根接口
mulai
xml: = loadXmlPacage ('' f:/work/费亚的文件 /task/xml/lab_xml/test.xml '); // 这个方法也是生成的接口单元中的。
xml.data.row [1] .name; // 比如我要取得 data 下的第 2 个 baris 中的 nama 属性。
很方便的 , 完全可以只要一个这样的接口单元就可以了 , 其它的什么都可以不要。接口单元中除了 loadxmlpacage 方法还有 newxmlpacage 方法和 getxmlpacage 方法 , 这三个方法是可以用于获得刚开始的 xml实例对象的 , 同时这个单元中所有新的接口也是继承 ixmlnode 接口的 , 所以你不必担心方法不够用。当然只能访问类似结构的 xml 实例 , 其它格式的要再重新创建一个对应的 xml 接口单元才可以。
时间 :
作者 : 费亚