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

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

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

2<XMLPackage>

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\费亚的文件\task\XML\lab_xml\country.xml’);

也可以这样动态创建:

Xml:= TXMLDocument.Create(nil);

Xml. LoadFromFile(‘F:\Work\费亚的文件\task\XML\lab_xml\country.xml’);

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

Xml.FileName:= F:\Work\费亚的文件\task\XML\lab_xml\country.xml;

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

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('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\费亚的文件\task\XML\lab_xml\test.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\费亚的文件\task\XML\lab_xml\test.xml ' ); // 这个方法也是生成的接口单元中的。

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

很方便的,完全可以只要一个这样的接口单元就可以了,其它的什么都可以不要。接口单元中除了LoadXMLPacage方法还有NewXMLPacage方法和GetXMLPacage方法,这三个方法是可以用于获得刚开始的XML实例对象的,同时这个单元中所有新的接口也是继承IXMLNode接口的,所以你不必担心方法不够用。当然只能访问类似结构的XML实例,其它格式的要再重新创建一个对应的XML接口单元才可以。

Delphi中TxmlDocument控件的用法 转的更多相关文章

  1. Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决

    Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决 EmbeddedWBWebBrowserDelphi  最近用E ...

  2. MFC中按钮控件的用法笔记(转)

    VC学习笔记1:按钮的使能与禁止 用ClassWizard的Member Variables为按钮定义变量,如:m_Button1:则m_Button1.EnableWindow(true); 使按钮 ...

  3. [转载]: delphi中XLSReadWrite控件的使用(1)---简介

    XLSReadWrite控件简介: 一个你需要的,能在Delphi和.NET下访问Excel文件的完美解决方案. 一个经典的读写Excel的控件,对于使用Excel 开发很有帮助 官方网站: http ...

  4. delphi中panel控件应用

    delphi中的panel控件是怎么使用的?研究了很久了,还是搞不懂,只知道把它放到form上面,其他操作一律不懂了,有谁可以请教一下,如何把其他控件放到里面去呢?谢谢 提问者采纳   直接把控件放到 ...

  5. iOS中UIButton控件的用法及部分参数解释

    在UI控件中UIButton是极其常用的一类控件,它的类对象创建与大多数UI控件使用实例方法init创建不同,通常使用类方法创建: + (id)buttonWithType:(UIButtonType ...

  6. 转Delphi中XLSReadWrite控件的使用(1)---简介

    XLSReadWrite控件简介: 一个你需要的,能在Delphi和.NET下访问Excel文件的完美解决方案. 一个经典的读写Excel的控件,对于使用Excel 开发很有帮助 官方网站: http ...

  7. delphi中DateTimePicker控件同时输入日期和时间

    将DateTimePicker的Format属性中加入日期格式设成 'yyyy-MM-dd HH:mm',注意大小写 , 将kind设置为dtkTime即可,可以在每次Form onShow时将Dat ...

  8. winform 窗体中 Time 控件的用法

    作用: 用于背景进程中.通过引发Timer事件,Timer控件可以有规律的隔一段时间执行一次代码.也就是,你可以根据你自己的需要,给Timer控件设置时间,Timer每隔这段时间,就执行一次代码. 属 ...

  9. C# WinForm中NotifyICon控件的用法

    参考:http://blog.csdn.net/paullink520/article/details/14170021 http://www.cnblogs.com/webman/archive/2 ...

随机推荐

  1. java - 异常浅谈

    java提供异常处理机制中,可以分为RuntimeException和checked Exception两种. RuntimeException 是运行时异常,是程序本身无法解决的.例如,对于一个用户 ...

  2. Parse和Convert的区别

    DateTime.Parse是转换String为DateTime Convert.ToDateTime是转换继承自Object的对象为DateTime的. 你得到一个object对象,你想把它转换为D ...

  3. HttpServletRequest 获取URL的方法及区别

    HttpServletRequest 获取请求的URL的方法有: 1.request.getRequestURL() 返回的是完整的url,包括Http协议,端口号,servlet名字和映射路径,但它 ...

  4. POJ 1936 All in All(模拟)

    All in All 题目链接:http://poj.org/problem?id=1936 题目大意:判断从字符串s2中能否找到子串s1.字符串长度为10W. Sample Input sequen ...

  5. 【转】Spring.NET学习笔记——目录

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  6. 简单的完全背包HDU1114

    今天广州下雨啦,不过没关系啦,反正我最近也都在刷题学习算法. 昨天做了五题01背包,今天还是背包,不过是完全背包,估计做动态规划要持续好一段时间,一开始选了一道简单题目啦. HDU1114,看了小一段 ...

  7. Android Studio中JNI -- 1 -- 配置方法

    1.配置NDK 1.1 下载NDK Android Studio 1.2 配 android-ndk-r10e,不同版本的Studio需要配置不同的ndk,下载完成后,随便解压放至某个文件目录下 1. ...

  8. [转]python yield

    任何使用yield的函数都称之为生成器,如: def count(n): while n > 0: yield n   #生成值:n n -= 1 另外一种说法:生成器就是一个返回迭代器的函数, ...

  9. 理解ThreadLocal背后的概念

    介绍 我之前在任何场合都没有使用过thread local,因此没有注意到它,直到最近用到它的时候. 前提信息 线程可以理解为一个单独的进程,它有自己的调用栈.在java中每一个线程都有一个调用栈或者 ...

  10. html5新增操作类名方式 classList

    如果一个元素有多个类名,要如何删除呢,jqeury提供了removeClass()这个api,如果不用插件,自己封装,可以这样 function removeClass(elm,removeClass ...