Delphi操作xml


  Delphi7 支撑对XML文档的操作, 可以通过TXMLDocument类来实现对XML文档的读写 。 可以利用TXMLDocument把XML文档读到内存中,从而 可以进行编辑、 保留操作 。TXMLDocument类是通过DOM(文档对象模型)接口来 拜访XML文档中的各个元素的 。关于DOM接口的实现有多种 模式,Delphi 支撑的 模式有:1)微软的MSXML SDK,这种 模式是通过COM对象来实现;2) Apache 的Xerces的实现 模式;3)另外一种是开源OpenXML实现 模式 。关于不同的接口实现 模式 可以通过设定TXMLDocument的DOMVender来进行操纵 。

   支撑XML的Delphi单元重要存在与…BorlandDelphi7SourceXml目录下,重要包括: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文档进行解析;

  三种解析器

  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解析器;

   使用不同解析器的 比较

关于三种 模式的解析器 比较如下:

  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 <> '' then

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的 支撑也是十分完善的 。