您的位置:首页 > 编程语言 > Delphi

Delphi操作xml

2012-02-01 01:00 387 查看
======================================================

注:本文源代码点此下载

======================================================

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^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: