国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

簡單分析TXMLDocument內部結構

2019-11-18 18:37:26
字體:
來源:轉載
供稿:網友
第一次對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);
跑到動態連接庫中去了,省得我浪費時間。


上一篇:進程間傳遞消息(發送和接收系統消息)

下一篇:音量調節及靜音

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 南开区| 收藏| 高邮市| 浙江省| 广饶县| 芜湖市| 大名县| 襄汾县| 秭归县| 三台县| 嘉义县| 南城县| 长乐市| 光山县| 班玛县| 永靖县| 阳曲县| 玉溪市| 全州县| 华安县| 伊吾县| 合作市| 安庆市| 邵阳市| 英超| 包头市| 新丰县| 玛多县| 额尔古纳市| 高州市| 岑溪市| 青神县| 荥阳市| 岳阳市| 任丘市| 嵩明县| 屯留县| 凉山| 桂东县| 扎囊县| 集安市|