当我们使用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);跑到动态连接库中去了,省得我浪费时间。共有 0 位网友发表了评论,平均得分: 0 查看完整内容