zoukankan      html  css  js  c++  java
  • Delphi操作XML简介

    参考:http://www.delphifans.com/InfoView/Article_850.html

       Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML文档的读写。可以利用TXMLDocument把XML文档读到内存中,从而可以进行编辑、保存操作。TXMLDocument类是通过DOM(文档对象模型)接口来访问XML文档中的各个元素的。对于DOM接口的实现有多种方式,Delphi 支持的方式有

    1)微软的MSXML SDK,这种方式是通过COM对象来实现

    2)Apache的Xerces的实现方式

    3)另外就是开源的OpenXML的实现方式。

      对于不同的接口实现方式可以通过设定TXMLDocument的DOMVender来进行控制。  

      支持XML的Delphi 单元主要存在与 ...BorlandDelphiSourceXml目录下,主要包括:XMLIntf、XMLDoc、xmldom、msxmldom、xercesxmldom、xdom、oxmldom等单元

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

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

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

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

    5)Xercesxmldom-----Borland通过Xerces XML DOM 方式来实现对Xmldom 中定义接口的封装

    6)Oxmldom-----Borland通过使用OpenXML来实现对Xmldom中定义接口的封装

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

    读写XML文档

      1)读取XML文档

      通常情况下不通过直接使用TXMLDocument对象来进行XML文件的读取,而是使用XMLDoc单元中提供的几个游泳的函数来读取XML文档,这些函数包括

    1.function LoadXMLDocument(const FileName :DOMString): IXMLDocument
    2.function LoadXMLData(const XLData :DOMString): IXMLDocument; overload;
    3.function LoadXMLData(const XMLData: string):IXMLDocument; overload;
    4.function NewXMLDocument(Version:DOMString='1.0'): IXMLDocument;
    

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

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

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

    XMLDoc := NewXMLDocument;
    XMLDoc.LoadFormFile(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中,在按炸ungMSXML 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解析的源码,那么应用这种方式,可以避免软件发布的种种问题,这是由于解析器的代码被静态编译在应用程序中,唯一的不好的地方就是应用程序的体积可能会大一些

      如何使用不同的解析器

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

    function NewDiffXmlDocument(DOMVendor: string; Version : DOMString = '1.0'): IXMLDocument;
    var
        XMLDoc : TXMLDocument;
    begin
        XMLDoc := TXMLDocument.Create(nil);
        XMLDoc.DOMVendor := GetDOMVender(DOMVendor);
        Result := XMLDoc;
        Result.Active := True;
        if Version <> '' then
            Result.Version := Version;
    end;
    

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

    1)MicroSoft-----存在于msxmldom.pas单元中的SMSXML常量

    2)Xerces-----存在于xercesxmldom.pas单元中的SXercesXML常量

    3)OpenXML-----存在yuoxmldom.pas单元中的SOpenXml常量

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

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

    结论

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

  • 相关阅读:
    Leetcode 238. Product of Array Except Self
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 290. Word Pattern
    Leetcode 205. Isomorphic Strings
    Leetcode 107. Binary Tree Level Order Traversal II
    Leetcode 102. Binary Tree Level Order Traversal
    三目运算符
    简单判断案例— 分支结构的应用
    用switch判断月份的练习
    java基本打印练习《我行我素购物系统》
  • 原文地址:https://www.cnblogs.com/xumenger/p/4375087.html
Copyright © 2011-2022 走看看