Delphi
支持對XML文檔的操作
可以通過TXMLDocument類來實現對XML文檔的讀寫
可以利用TXMLDocument把XML文檔讀到內存中
從而可以進行編輯
保存操作
TXMLDocument類是通過DOM(文檔對象模型)接口來訪問XML文檔中的各個元素的
對於DOM接口的實現有多種方式
Delphi支持的方式有
)微軟的MSXML SDK
這種方式是通過COM對象來實現
) Apache 的Xerces的實現方式
)另外一種是開源OpenXML實現方式
對於不同的接口實現方式可以通過設定TXMLDocument的DOMVender來進行控制
支持XML的Delphi單元主要存在於…\Borland\Delphi\Source\Xml目錄下主要包括XMLIntfXMLDocxmldommsxmldomxercesxmldomxdomoxmldom等單元
XMLIntf包括了Borland自己定義的XML文檔的接口
XMLDoc是對XMLIntf中所定義接口的Borland實現
Xmldom定義了DOM(文檔對象模型)接口這裡對DOM接口進行了Borland的實現
Msxmldom實現微軟對Xmldom中定義的接口的實現主要調用微軟的COM對象來實現對Xmldom中定義接口的封裝
XercesxmldomBorland通過Xerces XML DOM方式來實現對Xmldom中定義接口的封裝
OxmldomBorland通過使用OpenXML來實現對Xmldom中定義接口的封裝
TXMLDocument類的屬性請參考Borland的幫助文件
一讀寫XML文檔
1讀取XML文檔
通常情況下不通過直接使用TXMLDocument對象來進行XML文件的讀取而是使用XMLDoc單元中提供的幾個有用的函數來讀取XML文檔這些函數包括
function LoadXMLDocument(const FileName: DOMString): IXMLDocument;
function LoadXMLData(const XMLData: DOMString): IXMLDocument; overload;
function LoadXMLData(const XMLData: string): IXMLDocument; overload;
function NewXMLDocument(Version: DOMString = ): IXMLDocument;
可以看出這些函數全部返回的是IXMLDocument接口得到了IXMLDocument接口在進行文檔的操作
這些函數都是通過創建TXMLDocument對象來實現對XML文檔的讀取的其中NewXMLDocument僅僅創建一個IXMLDocument接口
可以這樣利用NewXMLDocument來讀取XML文檔
XMLDoc := NewXMLDocument;
XMLDocLoadFromFile(FileName);
2保存XML文檔
可以通過下面的方式來保存XML文檔
XMLDoc := NewXMLDocument;
iRoot := IXMLDocCreateNode(TestXMLDocument);
XMLDocDocumentElement := iRoot;
…
XMLDocSaveToFile(FileName);
可以看出通過接口來操作XML文檔是非常方便的
二選用不同類型的XML解析方式
上面已經提到有三種方式實現DOM也就是可以應用Borland提供的3種不同的XML解析器來對XML文檔進行解析
1三種解析器
(1)微軟的解析器(MSXML SDK)
微軟解析器主要應用在Windows中在安裝MSXML SDK的時候會安裝解析器同時IE浏覽器也提供了解析器這個解析器是一個COM
(2)Apache的Xerces解析器
Borland自己實現了一個Xerces解析器這個可以通過調用xercesxmldomdll模塊來實現如果使用這個解析器可能需要同應用程序一起進行分發xercesxmldomdllXercesLibdllCCMTDLL三個DLL文件
(3)OpenXML解析器
這個解析器的源代碼存在於xdompas單元中這個可以通過http://wwwphilode/xml/進行更新下載這個是一個德國人寫的XML解析器
2使用不同解析器的比較
對於三種方式的解析器比較如下
(1)微軟的解析器
微軟的解析器當然好了但是也不能排除存在的意外情況在我個人的經驗中至少我們公司對於XML解析的方式只有在IE以上的版本才能夠正常的工作至於Borland同樣是通過引入MSXMLDLL的接口來實現的所以可以推理出同樣存在同樣的問題這個通過研究TMSDOMImplementation(msxmldom單元中)的實現方式可以得到證明實現的過程中通過調用CoCreateInstance函數接口來實現解析的
在發布解析XML的代碼的時候可能就會存在由於IE的版本不同需要把IE一同發布比較麻煩
(2)Borland的Xerces解析器
這種方式的解析器是通過 LoadLibrary(PChar(LibName));函數LibName的內容是xercesxmldomdll(Windows平台)libxercesxmldomso(Linux平台)那麼就需要隨同應用程序一起發布Dll就包括了xercesxmldomdllXercesLibdllCCMTDLL
這個發布相對於發布不同版本的IE來說要相對簡單一些
(3)OpenXML解析器
由於存在xdompas單元這個單元中包含了完全的XML解析的源代碼那麼應用這種方式可以避免軟件發布的種種問題這是由於解析的代碼被靜態編譯在應用程序內部唯一不好的地方就是應用程序的體積可能要大一些
3如何使用不同的解析器
我們可以寫一個函數來使用不同的解析器
function NewDiffXmlDocument(DOMVender: string;Version: DOMString = ): IXMLDocument;
var
XMLDoc : TXMLDocument;
begin
XMLDoc := TXMLDocumentCreate(nil);
XMLDocDOMVendor := GetDOMVendor(DOMVender);
Result := XMLDoc;
ResultActive := True;
if Version <> then
ResultVersion := Version;
end;
其中DOMVender如果用Borland提供的三種方式進行解析的話分別取值是
Microsoft――存在於msxmldompas單元中的SMSXML常量
Xerces――存在於xercesxmldom pas單元中的SXercesXML常量
OpenXML――存在於oxmldompas單元中的SOpenXML常量
這個是由於在msxmldomxercesxmldomoxmldom三個單元的initailization部分都通過調用RegisterDOMVendor函數注冊了不同的解析器接口
當然Borland同樣提供了一種可以靈活進行擴展的機制來擴展用戶自己的解析器這個需要繼承TDOMVendor類(存在於xmldom單元中)實際上Borland自己就是通過這種方式來實現不同方式解析器的具體的實現過程可以通過參考oxmldom單元中對xdom的封裝
三結論
Delphi作為一個成功的開發工具它自身實現的對XML的支持肯定比網絡上某些實現要穩定高效的多我們沒有必要再進行另外的封裝什麼MSXMLDLL的COM接口當然可以自己實現不同的XML解析器也可以應用已經存在的解析器同時可以看出Delphi對於XML的支持也是非常完善的
From:http://tw.wingwit.com/Article/program/Delphi/201311/8508.html