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

Delphi中TXMLDocument控件的用法

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

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

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

2<XMLPackage>

3<clinetinfoip=”202.101.100.90”handler=”si”unit=”江苏网商软件”/>

4<data>

5<rowid=”1”COLOR:red;FONT-FAMILY:宋体;mso-ascii-font-family:‘TimesNewRoman‘;mso-hansi-font-family:‘TimesNewRoman‘">太阳"sex=”男”age="24"duty="软件工程师"/>

6<rowid=”2”COLOR:red;FONT-FAMILY:宋体;mso-ascii-font-family:‘TimesNewRoman‘;mso-hansi-font-family:‘TimesNewRoman‘">月亮"sex=”女”age="25"duty="部门经理"/>

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

8</data>

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

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

11</XMLPackage>

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

一、自己解析法:

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

(1)创建和添加:

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

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

也可以这样动态创建:

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是这样被创建的:

Varrootnode:XMLNode;

Rootnode:=xml.CreateNode(‘XMLPackage’);

Xml.DocumentElement:=rootnode;

接着我们创建不同类型的子节点,前面的实例中的第9行的节点比较有代表性,它是一个带有文本的子节点,同时又带有两个属性节点,我们来看看它是怎么被创建的,首先创建一个根节点:

xml.Active:=true;

xml.DocumentElement:=xml.CreateNode(‘XMLPacage‘);

接着我们创建memo子节点:

Varnode:IXMLNode;

node:=xml.CreateNode(‘memo‘);

xml.DocumentElement.ChildNodes.Add(node);

这种创建儿子节点的方法比较好,当然还可以:

xml.DocumentElement.AddChild(‘XMLPacage‘);

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

node.ChildNodes.Add(xml.CreateNode(‘Hello!Iamyaya!‘,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(constNode:IXMLNode)方法换成Insert(Index:Integer;constNode:IXMLNode),其它用法也就一目了然,不再详述了。

(2)读取和修改

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

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

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

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

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

begin

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

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

时间: 2024-08-05 19:37:37

delphi中的XML解析控件TXMLDocument的用法的相关文章

Cocos2dx中的四种控件及主要用法

1.控件:即控制对象,控制按钮之类的精灵 2.主要介绍四大类控件: CCControlSlider:进度条 CCControlSwitch:开关 CCScale9Sprite:9妹图(用于缩放) CCControlButton:控制按钮,最复杂,最灵活 3.使用方法: a.创建一个进度条: CCControlSlider *slider = CCControlSlider::create("slider/sliderTrack.png", "slider/sliderProg

Delphi中如何获取TDateTimePicker控件的属性值

参考资料:http://www.delphipages.com/forum/showthread.php?t=103412 var dtpDate: TDateTimePicker; begin dtpDate.Format := 'yyyy-MM-dd'; ShowMessage('时间:' + FormatDateTime('yyyy-MM-dd', dtpDate.Date)); //'yyyy-MM-dd'是时间显示的格式,更多格式请参照别的资料 end; dtpDate.Format

Delphi 中TWebBrowser的扩展控件TExWebBrowser

主要扩展了3D界面.右键菜单.是否显示图片.是否支持JAVA等功能. 代码如下: unit ExtWebBrowser; interface uses Windows, SysUtils, Classes, Controls, OleCtrls, SHDocVw, ActiveX, Forms, URLMon; type TDocHostUIInfo = packed record cbSize : ULONG; dwFlags : DWORD; dwDoubleClick : DWORD; p

android在代码中四种设置控件背景颜色的方法(包括RGB)

转载请注明出处: http://blog.csdn.net/fth826595345/article/details/9208771  TextView tText=(TextView) findViewById(R.id.textv_name); //第1种: tText.setTextColor(android.graphics.Color.RED);//系统自带的颜色类 // 第2种: tText.setTextColor(0xffff00ff);//0xffff00ff是int类型的数据

Delphi下使用Oracle Access控件组下TOraSession控件链接

Delphi下使用Oracle Access控件组下TOraSession控件链接数据库,使用  orsn1.Options.Direct:=true;  orsn1.Server:=IP:Port:SID;  orsn1.Username:=UserName;  orsn1.Password:=PassWord;  orsn1.Connect; 即可链接成功,这是使用SID方式链接的.但如果登陆数据库使用服务名方式,程序死活链接不上,原因,说是因为Delphi ODAC与Oracle RACD

Android自定义View(三、深入解析控件测量onMeasure)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:[openXu的博客] 目录: onMeasure什么时候会被调用 onMeasure方法执行流程 MeasureSpec类 从ViewGroup的onMeasure到View的onMeasure ViewGroup中三个测量子控件的方法 getChildMeasureSpec方法 View的onMeasure setMeasuredDimension ??在上一篇

android中一个评分的控件

RatingBar android中一个评分的控件 如何使用 Android Studio下: dependencies { compile 'com.hedgehog.ratingbar:app:1.0.2' } 1,在XML中 <com.hedgehog.ratingbar.RatingBar android:layout_marginTop="50dp" android:layout_gravity="center" android:id="@

android中常用的小控件------Widgets的使用

好久没有写博客了,都不知博客怎么写了,最近突然想写博客,以帮助更多的人,却又不知道写什么好呢? 好吧  我承认我有点懒惰了,可是程序猿是不应该懒惰的哦,俺要做个好孩子. 好了言归正传,开始介绍下今天的主要内容吧! Widgets一个桌面的小控件    个人认为是很常用的,不知道大神们是不是这么觉得的呢?比如说你开发的一款音乐播放器的软件,可把基本的上一曲和下一曲.暂停的几个功能放在这个小控件里面将它显示在桌面上来,这样就很方便啦,你想要下一曲.上一曲.暂停播放的时候,就不用再打开播放器了,而是直

在现有WinForms应用中添加C1Themes主题控件

在本博客中,展示了如何在现有的WinForms应用中添加C1Themes控件支持. 本文使用名为C1dView Samples的应用程序,它包含C1Reports.它是基于C1Ribbon界面设计的C1Report/C1PrintDocument浏览应用程序.该应用最初没有包含主题的支持. C1DView示例下载:C1dView.zip (94.96 kb) (下载次数: 7) 如下描述的简单的步骤,为最终用户提供在程序中选择使用包含于C1Themes控件产品中的若干主题的支持.(请注意:在进行