空间访问权限:游客, 头像访问权限:自己
[登录]后可以浏览更多信息
博客正文
【操作】
Delphi操作xml
作者思路清晰,行文流畅。

https://www.cnblogs.com/qingsong/articles/2630376.html

一、Delphi 对XML的支持---TXMLDocument类

       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写?梢岳肨XMLDocument把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等单元。
  • XMLIntf――包括了Borland自己定义的XML文档的接口;
  • XMLDoc――是对XMLIntf中所定义接口的Borland实现;
  • Xmldom――定义了DOM(文档对象模型)接口,这里对DOM接口进行了Borland的实现;
  • Msxmldom――实现微软对Xmldom中定义的接口的实现,主要调用微软的COM对象来实现,对Xmldom中定义接口的封装;
  • Xercesxmldom――Borland通过Xerces XML DOM方式来实现对Xmldom中定义接口的封装;
  • Oxmldom――Borland通过使用OpenXML来实现对Xmldom中定义接口的封装;

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

二、读写XML文档
  1、读取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);

    2、保存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。
  • Apache的Xerces解析器: Borland自己实现了一个Xerces解析器,这个可以通过调用xercesxmldom.dll?槔词迪;如果使用这个解析器可能需要同应用程序一起进行分发xercesxmldom.dll,XercesLib.dll,CC3260MT.DLL三个DLL文件
  • OpenXML解析器:这个解析器的源代码存在于xdom.pas单元中,这个可以通过http://www.philo.de/xml/进行跟新下载,这个是一个德国人写的XML解析器;

   2、使用不同解析器的比较

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

    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解析的源代码,那么应用这种方式,可以避免软件发布的种种问题,这是由于解析的代码被静态编译在应用程序内部。唯一不好的地方就是应用程序的体积可能要大一些;

    3、如何使用不同的解析器

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

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的支持也是非常完善的。  
栏目划分
WEB应用程序 (29)
桌面应用程序 (9)
Windows操作系统 (12)
xNix操作系统 (5)
数据库技术 (3)
多媒体技术 (1)
硬件技术 (4)
办公软件 (2)
以史为鉴 (2)
教学反思1 (2)
奇闻趣事 (5)
其它 (11)
教学反思 (4)
电子技术 (2)
中学生科技 (3)
 
主人推荐
音象定位和音箱喇叭的排步
我国高层意向已定:制造大飞机
“运十”悲剧
日尔曼人
细说百越族
宇宙深处的秘密——星云
[强烈推荐]中华56民族FLASH完整珍藏版
一组漂亮的植物
  
深圳市| 紫金县| 巴马| 那曲县| 阳原县| 普定县| 新巴尔虎左旗| 乡城县| 且末县| 临猗县| 建平县| 永康市| 溧水县| 永安市| 仙游县| 建阳市| 容城县| 乌苏市| 洛南县| 新丰县| 阜阳市| 高邑县| 日土县| 广水市| 中阳县| 色达县| 泰安市| 安国市| 习水县| 涞源县| 祁阳县| 德清县| 射洪县| 阜新| 瑞安市| 伊宁市| 兴城市| 泸溪县| 大理市| 邯郸市| 东丽区| http:// http:// http:// http:// http:// http://