网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.DELPHI下的多线程程序设计(2).
.Delphi中串口通信的实现.
.Delphi图象截取编程示例(2).
.delphi编写你的第一个com程序.
.Oracle中通过存储过程中返回数据.
.软件启动画面中启动状态的显示.
.Delphi数据库的动态建立.
.Windows优化大师注册机源码.
.用Delphi编写CGI程序(一).
.DELPHI下调节器用EXCEL为其编辑和.
.在Delphi中处理数据库日期型字段.
.自己编写树(Tree)的封装类.
.[Delphi版]罗技无限灵貂,驱动程序.
.进程查看器1.2版,欢迎下载.
.流的解压及压缩(代码精简高效).
.基本图象处理代码(2).
.Delphi数据库编程教程(二).
.在DELPHI程序中使用ADO对象存取O.
.Delphi7的IDE概述(二).
.ReportBuilder设置打印页范围技巧.

简单分析TXMLDocument内部结构

发表日期:2006-2-4


第一次对TXMLDocument感兴趣,也是第一次使用TXMLDocument的时候,当时,我在修改一个软件,只是想加一点功能,由于时间不多,我决定先做一个接口,再慢慢扩充,但如何使接口扩充性能好,能与各种工具混合,于是我想到了java用XML做配置的方法,语法很多想法来自C++,架构多来自java(上面哪部分想法也是抄自Java,哈哈),实现当然是用Delphi了,于是写了一个配置文件,发现TXMLDocument怎样也没法把数据读出来,检查了一天XML文件,未果,最后改了一下DOMVendor属性,改成OpenXML竟然通过了。现在我决定重走我的旧迹,以DOMVendor做切入点,开始简单分析一下TXMLDocument,正确选择切入点很重要,要不会浪费很多时间,有时这真要靠点运气.
  当点DOMVendor属性,它像是一个枚举属性,但在TXMLDocument定义为类TDOMVendor;这时候当然是想到要找DefineProperties,从DefineProperties追到 ReadDOMVendor,终于找到真正的入口GetDOMVendor(DOMVendorDesc).
  下面正式介绍它的结构。
  TXMLDocument内部分为两层,一层是IDOM*****,一层是IXML******,IXML是供用户使用的接口,IDOM***应该是以DOM做为模型定义的接口,供IXML使用,IDOM下面有各种具体实现手段,这是一个典型的Bridge模式,我把图画出来,大家可以与(<设计模式> GoF 中文版)101页哪个图对照一下。
当我们使用IXML***接口时,它将会使用IDOM去完成操作。
在这里IDOMDocument是继承IDOMNode的,但IXMLDocument却没有,似乎也不太必要,因为内部主要使用IDOM接口,如果要IDOMNode,可以用IDOMDocument去转换,其实根本用不到。
这么多实现,到底要怎样才能准确并且优美地创建对应的实例,在TXMLDocument内部使用了Abstract Factory模式,参照下图
Abstract Factory希望不用指定具体的类,但为了找到它们,在TXMLDocument是通过指定一个字符串,也就是我们点击DOMVendor时出现的哪几个字符串.现在回到开始,再来看看切入点
DOMVendor := GetDOMVendor(DOMVendorDesc);
最后取得一个IDOMImplementation,它有一个createDocument(….):IDOMDocument;函数,这个函数将返回一个IDOMDocument;接口让IXMLDoucment使用。
在如果使用MSXML,接口对应的是TMSDOMDocument,TMSDOMDocument是实际上是调用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);
跑到动态连接库中去了,省得我浪费时间。

上一篇:给Delphi/C++Builder程序员:编写高质量代码的一个小窍门 人气:3873
下一篇:进程间传递消息(发送和接收系统消息) 人气:5083
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐