程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 簡單分析TXMLDocument內部結構

簡單分析TXMLDocument內部結構

編輯:Delphi
第一次對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); 跑到動態連接庫中去了,省得我浪費時間。
  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved