JSPCN主页 | JSP空间 | 网站制作 | JSP下载 | JSP论坛 | JSP教程 | 关于JSPCN | 联系我们
JSP虚拟主机,jsp空间,java空间,java虚拟空间,详细请点击进入
做最专业的JSP中文网站 当前位置首页--JAVA技术--XML  
文章搜索:
关键字 标题
  
JSP中文网内容管理系统(JCMS)
JSP虚拟主机
网络笔记本
网摘,图片,笔记收藏
虚拟服务器

JSPCN文章目录分类
JSP配置[219]JSP基础[136]
中文问题[69]上传问题[27]
JAVABEAN[46]数据库[212]
文件操作[126]图片声音[17]
JSP其他[57]时间相关[16]
JAVAMAIL[72]STRUTS[144]
开发工具[28]教程系列[157]
JSP实例[89]
JAVA基础[421]APPLET[78]
JAVA网络[179]Applica[115]
Servlet[98]XML[163]
J2ME[257]J2EE[374]
考试相关[63]JAVA线程[90]
EJB[261]Swing[26]
Java API[141]声音图片[28]
异常处理[33]JAVA实例[290]
JAVA类[139]SUN[89]
Hibernate[6]JMX[8]
Spring[34]
本版推荐文章 
本版热点文章 
相关文章链接 
 
简单分析TXMLDocument内部结构
作者:     文章来源:
访问次数:151次     加入时间:2006年05月18日
第一次对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);

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


Copyright © 2002-2005 JSPCN.net. All rights reserved.
JSP中文网    备案序号:蜀ICP备05001583号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号