XML(eXtensible Markup Language可擴展標志語言)在近幾年的信息類雜志網站上可謂是最搶眼的一詞大大小小的信息產品都爭相和它搭上關系唯恐趕不及這輛快車有著良好口碑的寶藍(Borland)系列開發平台也不例外從版開始就集成了XML組件包因其使用MSXMLDom解析器相比於此前廣泛應用的XMLParser解析器MSXMLDom更顯規范中文兼容性更好(元素名屬性名均支持中文)很受開發者青睐為幫助初學者快速掌握Delphi中的XML編程筆者特寫此文以供交流
筆者通過一個讀寫XML文件的實例來說明XML編程的各個步驟只需讀者有結點元素屬性的基本概念就能容易的理解本文筆者所要讀入的XML文件結構如下所示命名為Inputxml
<學生花名冊>
<學生 性別 = 男>
<姓名>李華
<年齡>
<電話>
<學生 性別 = 男>
<姓名>張三
<年齡>
<電話>
Inputxml文件的第一行是XML的版本說明屬性encoding宣告使用何種字符集建立默認以Unicode 編碼(UTF 或UTF)這裡用中文GB碼第二行<學生花名冊>是根元素下面定義了兩個學生元素學生下面嵌套了三個子元素是對學生的進一步說明與之相對應的我們在Delphi中定義如下的學生數據結構//後面的文字是對變量或語句的說明下同
TStudent = class {學生}
sex : string; //學生性別
name : string; //學生姓名
age : integer; //學生年齡
phone: string; //電話號碼
end;
為了讀寫我們需要放置兩個TXMLDocument控件在Delphi VCL面板的Internet標簽頁裡那個標有XML字樣的控件就是當然此控件也可以動態創建但需要包含必要的文件這裡為簡單起見我們直接放置在窗體上分別命名為InXMLDoc和OutXMLDocInXMLDoc用於調入Inputxml文件OutXMLDoc用於暫存輸出到Outputxml的文檔
在窗體上放個按鈕我們把測試代碼直接放置在按鈕的單擊事件裡先定義幾個變量用來保存臨時信息如下所示
Root : IXMLNode; //指向XML根結點
Parent_Node: IXMLNode; //指向學生結點
Child_node : IXMLNode; //指向學生的子結點
Student : TStudent; //存單個學生信息
List : TList; //存學生列表
i : integer; //循環變量
我們先來讀入XML文件代碼如下
List := TListCreate; //初始化列表
InXMLDocLoadFromFile(Inputxml); //調入Inputxml文件
Root := InXMLDocDocumentElement; //取XML文件的根結點即<學生花名冊>
Parent_Node := RootChildNodesFirst; //使Parent_Node指向學生結點
while (Parent_Node <> nil) do //循環取多個學生可再多加幾個學生信息測試
begin
if (Parent_NodeNodeName = 學生) then //判斷是否為學生結點
begin
Student := TStudentCreate; //新建一個學生的結構信息
Studentsex := Parent_NodeAttributes[性別]; //取學生的性別屬性
Child_Node := Parent_NodeChildNodesFirst;
//使Child_Node指向該學生的第一個子結點信息
while (Child_Node <> nil) do //循環取學生的各個子各點
begin
if (Child_NodeNodeName = 姓名) then //判斷是否為姓名結點
Studentname := Child_NodeText //取姓名結點的值取於name字段中
else if (Child_NodeNodeName = 年齡) then //此行起後四行與前兩行類似
Studentage := StrToInt(Child_NodeText)
else if (Child_NodeNodeName = 電話) then
Studentphone := Child_NodeText;
Child_Node := Child_NodeNextSibling; //順序取下一個學生的子結點信息
end;
ListAdd(Student); //把一個學生信息加入列表
end;
Parent_Node := Parent_NodeNextSibling; //順序取下一個學生信息
end;
到這兒所有的學生信息都已存到List列表裡面了讀者可以跟蹤代碼測試
下面我們把List裡的臨時學生信息存到Outputxml文件裡代碼如下
OutXMLDocActive := true; //激活OutXMLDoc自動初始化空的XML文檔
OutXMLDocEncoding := GB; //設置字符集
Root := OutXMLDocAddChild(學生花名冊); //建根結點
for i := to ListCount do //循環取各個學生信息
begin
Student := ListItems[i]; //順序取一個學生信息
if (Student <> nil) then
begin
Parent_Node := RootAddChild(學生); //根結點後添加一個學生結點
Parent_NodeAttributes[性別] := Studentsex; //給學生結點設置性別屬性
Child_Node := Parent_NodeAddChild(姓名); //學生結點後添加一個姓名結點
Child_NodeText := Studentname; //設置姓名的文本值
Child_Node := Parent_NodeAddChild(年齡); //此行起後四行與前兩行類似
Child_NodeText := IntToStr(Studentage);
Child_Node := Parent_NodeAddChild(電話);
Child_NodeText := Studentphone;
end;
end;
OutXMLDocSaveToFile(Outputxml); //把組織好的XML文檔存於Outputxml文件中
OutXMLDocActive := false; //鈍化(關閉)OutXMLDoc
ListFree; //最後釋放保存臨時學生信息的列表
好了看看Inputxml和Outputxml內容是不是一樣是不是很簡單呢?其實在C++ Builder也有相同的組件只需將Pascal語法轉換成C++語法上面的代碼就完全可以用了有興趣的朋友可與筆者進一步交流其它XML應用以及程序設計模式JEE開發Rose UML建模等知識記住我的EMailnbDeveloper@hotmailcom
From:http://tw.wingwit.com/Article/program/Delphi/201311/24984.html