简单分析TXMLDocument内部结构

原创 2003年02月14日 08:58:00

 第一次对TXMLDocument感兴趣,也是第一次使用TXMLDocument的时候,当时,我在修改一个软件,只是想加一点功能,由于时间不多,我决定先做一个接口,再慢慢扩充,但如何使接口扩充性能好,能与各种工具混合,于是我想到了javaXML做配置的方法,语法很多想法来自C++,架构多来自java(上面哪部分想法也是抄自Java,哈哈),实现当然是用Delphi了,于是写了一个配置文件,发现TXMLDocument怎样也没法把数据读出来,检查了一天XML文件,未果,最后改了一下DOMVendor属性,改成OpenXML竟然通过了。现在我决定重走我的旧迹,DOMVendor做切入点,开始简单分析一下TXMLDocument,正确选择切入点很重要,要不会浪费很多时间,有时这真要靠点运气.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

   当点DOMVendor属性,它像是一个枚举属性,但在TXMLDocument定义为类TDOMVendor;这时候当然是想到要找DefineProperties,DefineProperties追到 ReadDOMVendor,终于找到真正的入口GetDOMVendor(DOMVendorDesc).

  下面正式介绍它的结构。

  TXMLDocument内部分为两层,一层是IDOM*****,一层是IXML******,IXML是供用户使用的接口,IDOM***应该是以DOM做为模型定义的接口,供IXML使用,IDOM下面有各种具体实现手段,这是一个典型的Bridge模式,我把图画出来,大家可以与(<设计模式> GoF 中文版)101页哪个图对照一下。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

当我们使用IXML***接口时,它将会使用IDOM去完成操作。

在这里IDOMDocument是继承IDOMNode的,但IXMLDocument却没有,似乎也不太必要,因为内部主要使用IDOM接口,如果要IDOMNode,可以用IDOMDocument去转换,其实根本用不到。

这么多实现,到底要怎样才能准确并且优美地创建对应的实例,在TXMLDocument内部使用了Abstract Factory模式,参照下图

Abstract Factory希望不用指定具体的类,但为了找到它们,在TXMLDocument是通过指定一个字符串,也就是我们点击DOMVendor时出现的哪几个字符串.现在回到开始,再来看看切入点

DOMVendor := GetDOMVendor(DOMVendorDesc);

最后取得一个IDOMImplementation,它有一个createDocument….:IDOMDocument;函数,这个函数将返回一个IDOMDocument;接口让IXMLDoucment使用。

在如果使用MSXML,接口对应的是TMSDOMDocumentTMSDOMDocument是实际上是调用MSXML技术,下面是调用MS COM的代码

function CreateDOMDocument: IXMLDOMDocument;

begin

  Result := TryObjectCreate([CLASS_DOMDocument40, CLASS_DOMDocument30,

    CLASS_DOMDocument26, msxml.CLASS_DOMDocument]) as IXMLDOMDocument;

  if not Assigned(Result) then

    raise DOMException.Create(SMSDOMNotInstalled);

end;

 

  CLASS_DOMDocument26: TGUID = '{F5078F1B-C551-11D3-89B9-0000F81FE221}';

  CLASS_DOMDocument30: TGUID = '{F5078F32-C551-11D3-89B9-0000F81FE221}';

  CLASS_DOMDocument40: TGUID = '{88D969C0-F192-11D4-A65F-0040963251E5}';

OpenXML却使用了另一种方法

它不知怎样又搞出一个TDomImplementation,里面又有一个createDocument,总之哪里代码多多,没精力看了。

还有哪个TXercesDOMImplementationFactory,好像是Linux下用了,却代码少少,一眼看完

  InitLibrary;

  GetDOMProc := GetProcAddress(FLibHandle, SGetDOMImpl);

  GetDOMProc(Result);

跑到动态连接库中去了,省得我浪费时间。

简单分析TXMLDocument内部结构

  • zgqtxwd
  • zgqtxwd
  • 2008年05月01日 00:21
  • 88

简单分析TXMLDocument内部结构

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";...
  • java169
  • java169
  • 2008年05月23日 23:32
  • 247

Delphi中使用TXMLDocument控件应注意的问题

今天写了一个类,其中用到了TXMLDocument控件。这个控件我是要动态生成的。但是却遇到了非常奇怪的问题,下面分享一下procedure TMainForm.Button1Click(Sender...
  • chaijunkun
  • chaijunkun
  • 2010年03月23日 13:19
  • 4043

TXMLDocument对XML文件进行读取和写入 (bcb)

动态创建TXMLDocument对XML文件进行读取和写入 - [Delphi高级应用]2008-01-16Tag:Delphi XML XMLDocument 版权声明:转载时请以超链接形式标明文章...
  • zdfcumt
  • zdfcumt
  • 2010年02月24日 11:41
  • 3656

Delphi与XML专题之一 -----Delphi7对XML的支持(TXMLDocument类)

  Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写。可以利用TXMLDocument把XML文档读到内存中,从而可以进行编辑、保存操作。TXMLDo...
  • xuleicsu
  • xuleicsu
  • 2006年05月28日 20:59
  • 1389

Delphi中动态调用TXMLDocument的经历

var  vXMLDocument: TXMLDocument;begin  vXMLDocument := TXMLDocument.Create(c:/temp/temp.xml);  Capti...
  • zswang
  • zswang
  • 2007年05月15日 19:05
  • 2822

动态创建TXMLDocument--使用IXMLDocument接口

var XML : TXMLDocument; DocIntf : IXMLDocument; begin XML := TXMLDocument.Create(nil); DocIn...
  • u010973206
  • u010973206
  • 2015年04月18日 13:24
  • 832

【漂亮!!】DMA深度剖析

需要了解总线结构。 由于是电子小白,只好广泛地学习一下。 先上点没有用的,纯为了挑起兴趣。 【原来DMA就在本本里】华硕笔记本A6Ja IDE通道最高才是ultra DMA mode2,死活都整...
  • ysmz4
  • ysmz4
  • 2015年06月30日 14:46
  • 611

c++builder使用XMLDocument操作XML进行增,删,改,读!

//头文件 #include #include #include //操作 //定义变量 AnsiString GameTDJpath;//只能是AnsiString类型 ...
  • goodai007
  • goodai007
  • 2011年11月29日 17:07
  • 4481

wpa_supplicant--内部结构分析

官方图: 内部结构分析
  • ltm157
  • ltm157
  • 2014年04月30日 18:31
  • 767
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单分析TXMLDocument内部结构
举报原因:
原因补充:

(最多只允许输入30个字)