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數據綁定特性。我們將在下一篇文章中論述。
發佈了29 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章