其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

Delphi7对XML的支持分析


发布日期:2023年08月22日
 
Delphi7对XML的支持分析
Delphi 支持对XML文档的操作可以通过TXMLDocument类来实现对XML文档的读写可以利用TXMLDocument把XML文档读到内存中从而可以进行编辑保存操作TXMLDocument类是通过DOM(文档对象模型)接口来访问XML文档中的各个元素的

对于DOM接口的实现有多种方式Delphi支持的方式有)微软的MSXML SDK这种方式是通过COM对象来实现) Apache 的Xerces的实现方式)另外一种是开源OpenXML实现方式对于不同的接口实现方式可以通过设定TXMLDocument的DOMVender来进行控制

支持XML的Delphi单元主要存在于…\Borland\Delphi\Source\Xml目录下主要包括XMLIntfXMLDocxmldommsxmldomxercesxmldomxdomoxmldom等单元

XMLIntf包括了Borland自己定义的XML文档的接口

XMLDoc是对XMLIntf中所定义接口的Borland实现

Xmldom定义了DOM(文档对象模型)接口这里对DOM接口进行了Borland的实现

Msxmldom实现微软对Xmldom中定义的接口的实现主要调用微软的COM对象来实现对Xmldom中定义接口的封装

XercesxmldomBorland通过Xerces XML DOM方式来实现对Xmldom中定义接口的封装

OxmldomBorland通过使用OpenXML来实现对Xmldom中定义接口的封装

TXMLDocument类的属性请参考Borland的帮助文件

读写XML文档

读取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 = ): IXMLDocument;

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

这些函数都是通过创建TXMLDocument对象来实现对XML文档的读取的其中NewXMLDocument仅仅创建一个IXMLDocument接口

可以这样利用NewXMLDocument来读取XML文档

XMLDoc := NewXMLDocument;

XMLDocLoadFromFile(FileName);

保存XML文档

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

XMLDoc := NewXMLDocument;

iRoot := IXMLDocCreateNode(TestXMLDocument);

XMLDocDocumentElement := iRoot;

XMLDocSaveToFile(FileName);

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

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

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

三种解析器

(1)微软的解析器(MSXML SDK)

微软解析器主要应用在Windows中在安装MSXML SDK的时候会安装解析器同时IE浏览器也提供了解析器这个解析器是一个COM

(2)Apache的Xerces解析器

Borland自己实现了一个Xerces解析器这个可以通过调用xercesxmldomdll模块来实现如果使用这个解析器可能需要同应用程序一起进行分发xercesxmldomdllXercesLibdllCCMTDLL三个DLL文件

(3)OpenXML解析器

这个解析器的源代码存在于xdompas单元中这个可以通过http://wwwphilode/xml/进行更新下载这个是一个德国人写的XML解析器

使用不同解析器的比较

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

(1)微软的解析器

微软的解析器当然好了但是也不能排除存在的意外情况在我个人的经验中至少我们公司对于XML解析的方式只有在IE以上的版本才能够正常的工作至于Borland同样是通过引入MSXMLDLL的接口来实现的所以可以推理出同样存在同样的问题这个通过研究TMSDOMImplementation(msxmldom单元中)的实现方式可以得到证明实现的过程中通过调用CoCreateInstance函数接口来实现解析的

在发布解析XML的代码的时候可能就会存在由于IE的版本不同需要把IE一同发布比较麻烦

(2)Borland的Xerces解析器

这种方式的解析器是通过LoadLibrary(PChar(LibName));函数LibName的内容是xercesxmldomdll(Windows平台)libxercesxmldomso(Linux平台)那么就需要随同应用程序一起发布Dll就包括了xercesxmldomdllXercesLibdllCCMTDLL

这个发布相对于发布不同版本的IE来说要相对简单一些

(3)OpenXML解析器

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

如何使用不同的解析器

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

function NewDiffXmlDocument(DOMVender: string;Version: DOMString = ): IXMLDocument;

var

XMLDoc : TXMLDocument;

begin

XMLDoc := TXMLDocumentCreate(nil);

XMLDocDOMVendor := GetDOMVendor(DOMVender);

Result := XMLDoc;

ResultActive := True;

if Version <> then

ResultVersion := Version;

end;

其中DOMVender如果用Borland提供的三种方式进行解析的话分别取值是

Microsoft――存在于msxmldompas单元中的SMSXML常量

Xerces――存在于xercesxmldom pas单元中的SXercesXML常量

OpenXML――存在于oxmldompas单元中的SOpenXML常量

这个是由于在msxmldomxercesxmldomoxmldom三个单元的initailization部分都通过调用RegisterDOMVendor函数注册了不同的解析器接口

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

结论

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

上一篇:Delphi面向对象编程的20条规则

下一篇:Delphi2009感想