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

2016-02-19 12:48 137 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享delphi中的XML解析控件TXMLDocument的用法的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - 编程语言 】

Delphi中TXMLDocument控件的用法

 

   Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,现称述于下面。

   在讲之前先给出一个XML实例,在讲某些部分是要结合实例比较容易理解。

1?xml version="1.0" encoding="gb2312"? !--文档版本信息, 注释格式同HTML--

2XMLPackage  

3  clinetinfo ip=”202.101.100.90” handler=”si” unit=”江苏网商软件”/

4  data

5     row id=”1” name="太阳" sex=”男” age="24" duty="软件工程师"/

 

6     row id=”2” name="月亮" sex=”女” age="25" duty="部门经理"/

7!--data中包含了元素 row的两个实例,通过属性id予以区分 --

8  /data

 

9    memo length=”16” color=” $0034494B”Hello! I am yaya! /memo !-- 这个元素中间包含的内容成为Text,而且也含有两个属性 length, color, 当然也可以没有属性 --

10   Actions acition=”update/insert”/ !—该元素描述了一动作控制信息--

11/XMLPackage

   TXMLDocument控件提供了我们两种常用做法:一、直接用这个类封装的属性和方法来读写XML文件,我把它称为自己解析法;二、用控件提供的XML Data Binding Wizard来创建一个适合用户自己的接口单元,然后按照这个接口单元提供的许多接口来实现对同类XML文件的读写,十分方便,但有局限性,我把它称为控件解析法。我重点讲第一种使用方法。

一、自己解析法:

 

  下面我将按创建、读取、修改、添加和删除这五个动作来分三类讲述。

 

1)创建和添加:

 

   首先要创建XML实例,可以这样动态创建:

 

TXMLDocument.Create(‘F:Work费亚的文件askXMLlab_xmlcountry.xml’);

 

   也可以这样动态创建:

 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

Xml:= TXMLDocument.Create(nil);

 

Xml. LoadFromFile(‘F:Work费亚的文件askXMLlab_xmlcountry.xml’);

 

   当然也可以从Internet面板上拖放一个TXMLDocument控件,然后再为FileName或XML属性赋值,比如对象名仍然叫xml(下都不说明都这样默认):

 

Xml.FileName:= F:Work费亚的文件askXMLlab_xmlcountry.xml;

 

至于它的另一个属性XML是用来直接赋XML语言,这个用法对我们暂不重要。创建完XML实例后要注意打开Active属性:

 

Xml.active:=true;

 

   这样下面对文件的读写操作才有效。如果没有XML文件可以用来创建XML的实例,即要建立XML文件,可以选择在上面一句之后,对XML实例操作,操作完毕之后加上:

 

Xml.SaveToFile(‘F:Work费亚的文件askXMLlab_xmlcountry.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');

 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来创建,建议使用第一种,CreateNode方法的用法是很丰富的,主要看它的第二个参数,上面其实是用了默认参数,下面我再看看怎样创建这个子节点的文本的:

 

node.ChildNodes.Add(xml.CreateNode('Hello! I am yaya!',ntText));

 

注意CreateNode方法的第二个参数,我们继续看属性是怎么创建的:

 

node.AttributeNodes.Add(xml.CreateNode('length',ntAttribute));

 

node.SetAttribute('length',16);

 

node.AttributeNodes.Add(xml.CreateNode('color',ntAttribute));

 

node.SetAttribute('color',$0034494B);

 

最后别忘了保存哦:

 

xml.SaveToFile('F:Work费亚的文件askXMLlab_xmlest.xml');

 

xml.Active:=false;

 

到此我们就结束了创建,至于添加,即插入节点,要插在指定节点后将上面的add(const Node: IXMLNode)方法换成Insert(Index: Integer; const Node: IXMLNode),其它用法也就一目了然,不再详述了。

 

(2)读取和修改

 

读取比较简单,主要是读取子节点的文本和属性值,方法是比较简单,关键就是要利用IXMLNodeList接口来提供的一些属性和方法来循环搜索到指定节点就OK了。文本和属性值的读取方法在delphi中提供的方法有很多,我就讲一种:NodeValue属性,它是IXMLNode接口的一个属性,它的值是OleVariant类型,意味着我们在XML文件里虽然都是存的字符串,但delphi会帮我们来转换数据格式,比如有个属性节点叫node:

 

Node.NodeValue:=16;//16是integer类型

 

虽然在XML文件中保存的是ASCII格式的16,但当我们要读取的时候delphi还会帮我们换回来的,只要这样就可以了:

 

Var len:integer;

 

Len:=node.NodeValue;

 

当然我们要注意的就是,用这种方法读取的时候最好先查看同一节点的NodeType属性,因为有几种类型的节点避免发生异常,对照如下:

 

NodeType

 

NodeValue

 

ntAttribute 属性节点

 

属性的值

 

ntElement元素节点

 

如果这个节点没有子节点,就返回它的TEXT,否则有异常

 

ntText文本节点

 

TEXT的内容

 

上面讲的都是读和写节点的值,有时候也要读和写节点名,就要访问NodeName属性,使用方法大概相同,也要结合NodeValue来使用:

 

NodeType

 

NodeName

 

ntAttribute 属性节点

 

属性的名字

 

ntElement元素节点

 

节点的名字

 

ntText文本节点

 

‘#text’

 

   读取就完了,当然我们上面是通过接口的属性来做的,接口也有方法来完成,就不说了,对上面的几个属性都是可读可写的,所以修改也基本清楚了。

 

(3)删除

 

   删除主要给出了删除指定节点,主要是看IXMLNodeList接口的几个方法,Clear和Delete方法,其中前一个是全部清空,后一个是删除指定的子节点,这个方法是重载的,可以按名字也可以按顺序号,即Count属性,非常方便!

 

 

二、控件解析法:

 

   为控件的FileName属性选择一个XML样板文件,然后由击控件选择XML Data Binding Wizard…,在这个向导中间会创建一个xdb文件。在弹出的向导中, 第一页中, 可以看到Delphi已经帮你把XML文件中的各个节点对应到了接口,这里你可以展开每个节点,编辑每个节点的属性数据类型。单击Next到下一个配置页面,这里你可以看到Delphi生成了各个节点接口的框架代码。 单击 Finsh 完成向导, 这样Delphi将生成一个xdb 文件和与该XML文档结构对应的XML接口单元。再以后访问该类XML文件时,只需要参照生成的XML接口单元里的方法和属性就能很方便的读取节点:

var xml :IXMLXMLPackageType;  // 通过向导生成的根接口

begin

     xml := LoadXMLPacage ( ''F:Work费亚的文件askXMLlab_xmlest.xml ' ); // 这个方法也是生成的接口单元中的。

     xml.Data.Row[1].name;  // 比如我要取得data下的第2个

来源:http://www.tulaoshi.com/n/20160219/1602005.html

延伸阅读
标签: Web开发
你现在应该知道XML只说明数据的结构而并不关心数据是如何具体描述的、数据是否正确。XML文档的强制性结构化需求是通过DTD(文档类型说明)来实现的。那就是本系列文章中先前讲述的主题。在本文里,我们概要介绍DTD所存在的缺点,讨论新型的更为强大的标准XML Schema。     其他文章   以下是本系列的另两篇文...
标签: Web开发
XMD类,非常好用。 先准备下一个qq.xml(我教学用到的1个例子) QQ  我的好友  sonygod  主要资料 帐号="54022626" 昵称="rockVsTone" 备注="sonygod" 年龄="25" 性别="男" 国家地区="中华人民共和国" 州省="广东省" 城市="广州" 个性签名="五一,远方的人你是否归来?"/  详细资料 生肖="狗" 职业="计算机业" 星座=...
Mscomm是微软一个强大的串口通讯的控件,其强大,简单的特点今我们不舍,在delphi中我们也可以使用它。下面这些代码是针对发送和接收为16进制处理的。 var   senddata:array[1..10] of char;   reData:array of Variant;   sendstr:string;   restr:string;   i:longint; begin  ...
标签: Web开发
在as3中使用特殊字符的时候,不小心就会出现错误,要么字符没有被显示,要么显示的不对,本文章就此做一个简单的分析,如有更好的分析,请一定要跟贴。 sample.xml和sample_cdata.xml是本例需要用到的xml文件,请点击查看他们的内容,本例以特殊字符 和 为例;文本字符串变量为txt, 显示文本的名称为shwo_txt。 由于html和xml中和...
  unit USWLMSelectDa; {$S-,W-,R-}                                             ...