Delphi 6 XML文件編程
Delphi 6 含有許多更新更強的XML支持功能。Delphi早期版本中提到的XML只在說明MIDAS數據格式和XMLBroker組件(在ClientDataSet和ADODataSet組件中也提到過)。
Delphi 6提供的XML功能增加了XML文件編程,XML數據綁定向導,XML映象和BizSnap(SOAP/XML Web服務)。本文是三篇論述Delphi 6中XML功能系列文章的第一篇,論述Delphi 6中的XML文件編程(XML Document Programming)。
XML文件
就在前幾年XML剛剛問世的時候,它就被賦予電子商務的世界語的美稱,尤其在B2B(business-2-business)領域內更是如此。原因就是XML是個非常簡單的而又是結構化的ASCII文本語言,任何人和任何事都能讀懂它。與作爲當前網頁標準格式的HTML語言不一樣。兩者之間的不同之處在於:HTML要用預先定義的語法集來解釋;XML文件雖然要遵循通用的語法規則,但真正的關鍵詞(標記)則是由作者決定的。其含義可由DTD(Document Type Definition)文件或者現在更爲流行使用的綱(Schema)來選擇定義。使用DTD或Schema的XML文件可以說是一個自我解釋的文件,在數據集成化和出錯調整時都很有用。
XML的結構化模式使得數據和信息可以在應用程序之間相互傳遞(包括在多層應用的中間層之間,例如Delphi提供的功能)。它提供一個標準格式,對所用的通訊協議是透明的。這就是XML在電子商務應用的電子數據交換(Electronic Data Interchange, EDI)和B2B中扮演重要角色的原因。通過DTD或者Schema來“定義”(或檢查)XML文件理所當然地使得任何人都可以與任何其它人和事交談,只要使用恰當的的XML/DTD/Schema組合。現在越來越經常要求集成現有的系統,XML可能成爲系統之間相互交談和理解的“語言”。
本文不討論涉及EDI或B2B的XML。但它引出三篇論及XML文件編程和Delphi 6的XML新特性的文章。
XML文件編程
Delphi 6 支持DOM解析,因此我們可以讀(和翻譯!)以及編輯任何XML文件,甚至在缺少了DTD或Schema的情況下,一如本文所示。我在本文創建了一個包含我的網頁內容的小小的XML文件:
<?xml version="1.0" standalone="yes" ?>
dbExpress and DataSnap2002/01/10WebBroker/InternetExpress and WebSnap2002/01/31WebSnap and Adapters2002/02/21BizSnap and WebServices2002/03/14WebSnap and BizSnap2002/04/04
這個XML文件將作爲這組系列文章的例子(本文以及後面的XML數據綁定和XML映像等文章裏都會用到)。
TXMLDocument組件
要進行XML文件編程就要用到TXMLDocument組件(在Delphi 6組件欄的Internet標籤裏)。可以從那裏拖拽一個組件到窗體或數據模塊上。TXMLDocument組件有些值得一提的屬性。顯然,Active屬性可以用於打開XML文件,但我們這會兒還用不上。DOMVendor屬性定義了XML文件的解析器。在我的機器上,被置爲"MSXML"。可以自己插入其它類型的DOMVendor(實際就是任何能夠執行IDOMImplementation的接口組件)。在使用自己的DOMVendor組件前,要對它先進行註冊。DOMVendor是一個全局變量,含有一個DOMVendor註冊值表。這樣第三方的DOMVendor可以在註冊後加入這個表,讓用戶可以自行選擇TXMLDocument的DOMVendor屬性值。
TXMLDocument的第三個屬性是FileName,指向XML文件(本例爲clinics.xml)。如果XML文件並不是直接存在,而是通過其它轉換獲得,也可以設置這個屬性值[譯者注:只要使用的解析器支持,甚至可以指向一個URL]。這是在EDI和B2B裏的基本用法,這種場合下往往不必[有時也不可能 - 譯者]存儲真正的XML文件。
NodeIndentStr屬性決定子節點的後移位置,缺省值爲二個空格,最多可選到八個空格。這個屬性只有在選項裏設置了doNodeAutoIndent標識爲真(True)後纔有效,這個標識的缺省狀態爲非真(False)。組件選項裏還有其它標識,如NodeAutoCreate, AttrNull, AutoPrefix, NamespaceDecl和AutoSave。AutoSave使得組件在關閉時能夠將XML文件發生的變動自動存盤。我覺得這是個非常好的特性,所以在我的例子裏,我把它設置爲真(它的缺省狀態是非真)。
除了常規選項之外,XMLDocument組件還有解析選項,如ResolveExternals, ValidateOnParse, PreserveWhiteSpace和AsyncLoad,這些標識的意義從名字上就可以看出。
XMLDocument組件的最後一個屬性是XML,指向一條XML的字符串(點擊屬性旁邊的省略號可以編輯XML)。正如我前面說過的,這在B2B多層應用中是非常有用的。這時中間層往往接收從其它應用中得到XML字符串,就要對這些XML數據進行處理或“編程”。
XML文件編程
只要稍作設置(設置FileName爲clinics.xml和將doAutoSave置爲真),就可以激活TXMLDocument組件。激活之後,就可以遍歷節點,讀取和編輯數據。
現在我們可以在XMLDocument裏訪問各個節點(IXMLNode),遞歸訪問各節點的子節點。例如,可以用一個按鈕來獲取第一個節點的元素值並將結果寫入Memo:
procedure TForm1.Button1Click(Sender: TObject);
var
Clinic: IXMLNode;
begin
Clinic := XMLDocument1.DocumentElement.ChildNodes[0];
Memo1.Lines.Clear;
Memo1.Lines.Add(Clinic.ChildNodes['Title'].Text);
Memo1.Lines.Add(Clinic.ChildNodes['Date'].Text);
Memo1.Lines.Add(Clinic.ChildNodes['Topics'].Text)
end;
增加索引指針可以訪問其它節點。下面的例子用"current"作索引,通過循環增加"current"的值來遍歷節點。我用try-except來防止循環出界。
procedure TForm1.Button2Click(Sender: TObject);
var
Clinic: IXMLNode;
begin
Inc(current);
try
Clinic := XMLDocument1.DocumentElement.ChildNodes[current];
Memo1.Lines.Clear;
Memo1.Lines.Add(Clinic.ChildNodes['Title'].Text);
Memo1.Lines.Add(Clinic.ChildNodes['Date'].Text);
Memo1.Lines.Add(Clinic.ChildNodes['Topics'].Text);
except
on E: Exception do
Memo1.Lines.Add(E.Message)
end
end;
除了遍歷節點之外,還可以修改子節點的值。下面的代碼將第一個節點的標題值加上一個"HOT"前綴。
procedure TForm1.Button1Click(Sender: TObject);
var
Clinic: IXMLNode;
begin
current := 0;
Clinic := XMLDocument1.DocumentElement.ChildNodes[current];
Memo1.Lines.Clear;
Clinic.ChildNodes['Title'].Text := 'HOT: ' + Clinic.ChildNodes['Title'].Text;
Memo1.Lines.Add(Clinic.ChildNodes['Title'].Text);
Memo1.Lines.Add(Clinic.ChildNodes['Date'].Text);
Memo1.Lines.Add(Clinic.ChildNodes['Topics'].Text);
end;
還可以增刪節點。下面的代碼增加一個子節點並賦予缺省值:
procedure TForm1.Button1Click(Sender: TObject);
var
Clinic: IXMLNode;
begin
Clinic := XMLDocument1.DocumentElement.AddChild('Clinic');
Clinic.ChildNodes['Title'].Text := 'Title';
Clinic.ChildNodes['Date'].Text := 'Date';
Clinic.ChildNodes['Topics'].Text := 'Topics';
end;
記住,我們已經將AutoSave設置爲真。所以在XMLDocument對象或應用關閉時,任何變化都將自動存盤。也可以調用XMLDocument1.SaveToFile方法顯式存盤。
下一篇文章:XML數據綁定
XMLDocument讓我們能夠訪問XML節點並編輯節點。但我們只能與無類型節點打交道,必須記住節點元素的名字。用上面的代碼可以漂亮地處理小型的XML文件,但是,Delphi如果只能處理這樣簡單的問題就不成其爲Delphi了。運用XML的內容相關結構可以做更高級的應用,這就是Delphi 6提供的XML數據綁定特性。我們將在下一篇文章中論述。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.