Delphi操作xml

来源:互联网 发布:多核软件如何运行 编辑:程序博客网 时间:2024/04/27 21:12

======================================================
注:本文源代码点此下载
======================================================

delphi7 支持对xml文档的操作,可以通过txmldocument类来实现对xml文档的读写。可以利用txmldocument把xml文档读到内存中,从而可以进行编辑、保存操作。txmldocument类是通过dom(文档对象模型)接口来访问xml文档中的各个元素的。对于dom接口的实现有多种方式,delphi支持的方式有:1)微软的msxml sdk,这种方式是通过com对象来实现;2) apache 的xerces的实现方式;3)另外一种是开源openxml实现方式。对于不同的接口实现方式可以通过设定txmldocument的domvender来进行控制。

支持xml的delphi单元主要存在与…\borland\delphi7\source\xml目录下,主要包括:xmlintf,xmldoc,xmldom,msxmldom,xercesxmldom,xdom,oxmldom等单元。

l xmlintf――包括了borland自己定义的xml文档的接口;

l xmldoc――是对xmlintf中所定义接口的borland实现;

l xmldom――定义了dom(文档对象模型)接口,这里对dom接口进行了borland的实现;

l msxmldom――实现微软对xmldom中定义的接口的实现,主要调用微软的com对象来实现,对xmldom中定义接口的封装;

l xercesxmldom――borland通过xerces xml dom方式来实现对xmldom中定义接口的封装;

l oxmldom――borland通过使用openxml来实现对xmldom中定义接口的封装;

txmldocument类的属性,请参考borland的帮助文件;

读写xml文档

l 读取xml文档

通常情况下不通过直接使用txmldocument对象来进行xml文件的读取,而是使用xmldoc单元中提供的几个有用的函数来读取xml文档,这些函数包括:

function loadxmldocument(const filename: domstring): ixmldocument;

function loadxmldata(const xmldata: domstring): ixmldocument; overload;

function loadxmldata(const xmldata: string): ixmldocument; overload;

function newxmldocument(version: domstring = '1.0'): ixmldocument;

可以看出这些函数全部返回的是ixmldocument接口,得到了ixmldocument接口在进行文档的操作;

这些函数都是通过创建txmldocument对象来实现对xml文档的读取的;其中newxmldocument仅仅创建一个ixmldocument接口。

可以这样利用newxmldocument来读取xml文档:

xmldoc := newxmldocument;

xmldoc.loadfromfile(filename);

l 保存xml文档

可以通过下面的方式来保存xml文档:

xmldoc := newxmldocument;

iroot := ixmldoc.createnode(‘testxmldocument’);

xmldoc.documentelement := iroot;

xmldoc.savetofile(filename);

可以看出通过接口来操作xml文档是非常方便的;

选用不同类型的xml解析方式

上面已经提到有三种方式实现dom,也就是可以应用borland提供的3种不同的xml解析器来对xml文档进行解析;

l 三种解析器

1、微软的解析器(msxml sdk)

微软解析器主要应用在windows中,在安装msxml sdk的时候会安装解析器,同时ie浏览器也提供了解析器,这个解析器是一个com。

2、apache的xerces解析器

borland自己实现了一个xerces解析器,这个可以通过调用xercesxmldom.dll模块来实现;如果使用这个解析器可能需要同应用程序一起进行分发xercesxmldom.dll,xerceslib.dll,cc3260mt.dll三个dll文件

3、openxml解析器

这个解析器的源代码存在于xdom.pas单元中,这个可以通过http://www.philo.de/xml/进行跟新下载,这个是一个德国人写的xml解析器;

l 使用不同解析器的比较

对于三种方式的解析器比较如下:

1、微软的解析器

微软的解析器当然好了,但是也不能排除存在的意外情况,在我个人的经验中,至少我们公司对于xml解析的方式,只有在ie6.0以上的版本才能够正常的工作;

至于,borland同样是通过引入msxml.dll的接口来实现的,所以可以推理出,同样存在同样的问题;这个通过研究tmsdomimplementation(msxmldom单元中)的实现方式可以得到证明,实现的过程中通过调用cocreateinstance函数接口来实现解析的;

在发布解析xml的代码的时候可能就会存在由于ie的本版的不同,需要把ie6.0一同发布,比较麻烦;

2、borland的xerces解析器

这种方式的解析器是通过 loadlibrary(pchar(libname));函数,libname的内容是xercesxmldom.dll(windows平台),libxercesxmldom.so.1(linux平台)。那么就需要随同应用程序一起发布的dll,就包括了xercesxmldom.dll,xerceslib.dll,cc3260mt.dll;

这个发布相对于发布不同版本的ie6.0来说要相对简单一些;

3、openxml解析器

由于存在xdom.pas单元,这个单元中包含了完全的xml解析的源代码,那么应用这种方式,可以避免软件发布的种种问题,这是由于解析的代码被静态编译在应用程序内部。唯一不好的地方就是应用程序的体积可能要大一些;

l 如何使用不同的解析器

我们可以写一个函数来使用不同的解析器;

function newdiffxmldocument(domvender: string;

version: domstring = '1.0'): ixmldocument;

var

xmldoc : txmldocument;

begin

xmldoc := txmldocument.create(nil);

xmldoc.domvendor := getdomvendor(domvender);

result := xmldoc;

result.active := true;

if version result.version := version;

end;

其中domvender如果用borland提供的三种方式进行解析的话,分别取值是:

microsoft――存在于msxmldom.pas单元中的smsxml常量;

xerces――存在于xercesxmldom .pas单元中的sxercesxml常量;

openxml――存在于oxmldom.pas单元中的sopenxml常量;

这个是由于在msxmldom,xercesxmldom,oxmldom三个单元的initailization部分,都通过调用registerdomvendor函数,注册了不同的解析器接口;

当然,borland同样提供了一种可以灵活进行扩展的机制来扩展用户自己的解析器,这个需要继承,tdomvendor类(存在于xmldom单元中)。实际上,borland自己就是通过这种方式来实现不同方式解析器的;具体的实现过程可以通过参考oxmldom单元中对xdom的封装;

结论

delphi作为一个成功的开发工具,它自身实现的对xml的支持,肯定比网络上某些实现要稳定、高效的多,我们没有必要再进行另外的封装什么msxml.dll的com接口。当然,可以自己实现不同的xml解析器,也可以应用已经存在的解析器。同时,可以看出delphi对于xml的支持也是非常完善的。

作者:邬畏畏


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击