簡析Delphi中的XML編程
發(fā)表時(shí)間:2023-08-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]寧波吉聯(lián)計(jì)算機(jī)技術(shù)有限公司研發(fā)部 徐榮勝 XML(eXtensible Markup Language可擴(kuò)展標(biāo)志語言)在近幾年的信息類雜志、網(wǎng)站上可謂是最搶眼的一詞。大大小小的信息產(chǎn)品都爭相和它搭上...
寧波吉聯(lián)計(jì)算機(jī)技術(shù)有限公司研發(fā)部 徐榮勝
XML(eXtensible Markup Language可擴(kuò)展標(biāo)志語言)在近幾年的信息類雜志、網(wǎng)站上可謂是最搶眼的一詞。大大小小的信息產(chǎn)品都爭相和它搭上關(guān)系,唯恐趕不及這輛快車。有著良好口碑的寶藍(lán)
(Borland)系列開發(fā)平臺也不例外,從6.0版開始就集成了XML組件包,因其使用MSXMLDom解析器,相比于此前廣泛應(yīng)用的XMLParser解析器,MSXMLDom更顯規(guī)范、中文兼容性更好(元素名、屬性名均支持中文),很受開發(fā)者青睞。為幫助初學(xué)者快速掌握Delphi中的XML編程,筆者特寫此文,以供交流。
筆者通過一個讀寫XML文件的實(shí)例來說明XML編程的各個步驟,只需讀者有結(jié)點(diǎn)、元素、屬性的基本概念就能容易的理解本文。筆者所要讀入的XML文件結(jié)構(gòu)如下所示,命名為Input.xml。
<學(xué)生花名冊>
<學(xué)生 性別 = "男">
<姓名>李華
<年齡>14
<電話>6287555
<學(xué)生 性別 = "男">
<姓名>張三
<年齡>16
<電話>8273425
Input.xml文件的第一行是XML的版本說明,屬性encoding宣告使用何種字符集建立,默認(rèn)以Unicode 編碼(UTF-8 或UTF-16),這里用中文GB2312碼。第二行“<學(xué)生花名冊>“是根元素。下面定義了兩個學(xué)生元素,學(xué)生下面嵌套了三個子元素,是對學(xué)生的進(jìn)一步說明。與之相對應(yīng)的,我們在Delphi中定義如下的學(xué)生數(shù)據(jù)結(jié)構(gòu),"//"后面的文字是對變量或語句的說明,下同。
TStudent = class {學(xué)生}
sex : string; //學(xué)生性別
name : string; //學(xué)生姓名
age : integer; //學(xué)生年齡
phone: string; //電話號碼
end;
為了讀寫,我們需要放置兩個TXMLDocument控件,在Delphi VCL面板的Internet標(biāo)簽頁里那個標(biāo)有XML字樣的控件就是,當(dāng)然此控件也可以動態(tài)創(chuàng)建,但需要包含必要的文件,這里為簡單起見,我們直接放置在窗體上,分別命名為InXMLDoc和OutXMLDoc,InXMLDoc用于調(diào)入Input.xml文件,OutXMLDoc用于暫存輸出到Output.xml的文檔。
在窗體上放個按鈕,我們把測試代碼直接放置在按鈕的單擊事件里。先定義幾個變量,用來保存臨時(shí)信息,如下所示:
Root : IXMLNode; //指向XML根結(jié)點(diǎn)
Parent_Node: IXMLNode; //指向?qū)W生結(jié)點(diǎn)
Child_node : IXMLNode; //指向?qū)W生的子結(jié)點(diǎn)
Student : TStudent; //存單個學(xué)生信息
List : TList; //存學(xué)生列表
i : integer; //循環(huán)變量
我們先來讀入XML文件,代碼如下:
List := TList.Create; //初始化列表
InXMLDoc.LoadFromFile('Input.xml'); //調(diào)入Input.xml文件
Root := InXMLDoc.DocumentElement; //取XML文件的根結(jié)點(diǎn),即“<學(xué)生花名冊>”
Parent_Node := Root.ChildNodes.First; //使Parent_Node指向?qū)W生結(jié)點(diǎn)
while (Parent_Node <> nil) do //循環(huán)取多個學(xué)生,可再多加幾個學(xué)生信息測試
begin
if (Parent_Node.NodeName = '學(xué)生') then //判斷是否為學(xué)生結(jié)點(diǎn)
begin
Student := TStudent.Create; //新建一個學(xué)生的結(jié)構(gòu)信息
Student.sex := Parent_Node.Attributes['性別']; //取學(xué)生的性別屬性
Child_Node := Parent_Node.ChildNodes.First;
//使Child_Node指向該學(xué)生的第一個子結(jié)點(diǎn)信息
while (Child_Node <> nil) do //循環(huán)取學(xué)生的各個子各點(diǎn)
begin
if (Child_Node.NodeName = '姓名') then //判斷是否為姓名結(jié)點(diǎn)
Student.name := Child_Node.Text //取姓名結(jié)點(diǎn)的值,取于name字段中
else if (Child_Node.NodeName = '年齡') then //此行起后四行與前兩行類似
Student.age := StrToInt(Child_Node.Text)
else if (Child_Node.NodeName = '電話') then
Student.phone := Child_Node.Text;
Child_Node := Child_Node.NextSibling; //順序取下一個學(xué)生的子結(jié)點(diǎn)信息
end;
List.Add(Student); //把一個學(xué)生信息加入列表
end;
Parent_Node := Parent_Node.NextSibling; //順序取下一個學(xué)生信息
end;
到這兒,所有的學(xué)生信息都已存到List列表里面了,讀者可以跟蹤代碼測試。
下面我們把List里的臨時(shí)學(xué)生信息存到Output.xml文件里,代碼如下:
OutXMLDoc.Active := true; //激活OutXMLDoc,自動初始化空的XML文檔
OutXMLDoc.Encoding := 'GB2312'; //設(shè)置字符集
Root := OutXMLDoc.AddChild('學(xué)生花名冊'); //建根結(jié)點(diǎn)
for i := 0 to List.Count - 1 do //循環(huán)取各個學(xué)生信息
begin
Student := List.Items[i]; //順序取一個學(xué)生信息
if (Student <> nil) then
begin
Parent_Node := Root.AddChild('學(xué)生'); //根結(jié)點(diǎn)后添加一個學(xué)生結(jié)點(diǎn)
Parent_Node.Attributes['性別'] := Student.sex; //給學(xué)生結(jié)點(diǎn)設(shè)置性別屬性
Child_Node := Parent_Node.AddChild('姓名'); //學(xué)生結(jié)點(diǎn)后添加一個姓名結(jié)點(diǎn)
Child_Node.Text := Student.name; //設(shè)置姓名的文本值
Child_Node := Parent_Node.AddChild('年齡'); //此行起后四行與前兩行類似
Child_Node.Text := IntToStr(Student.age);
Child_Node := Parent_Node.AddChild('電話');
Child_Node.Text := Student.phone;
end;
end;
OutXMLDoc.SaveToFile('Output.xml'); //把組織好的XML文檔存于Output.xml文件中
OutXMLDoc.Active := false; //鈍化(關(guān)閉)OutXMLDoc
List.Free; //最后釋放保存臨時(shí)學(xué)生信息的列表
好了,看看Input.xml和Output.xml內(nèi)容是不是一樣。是不是很簡單呢?其實(shí)在C++ Builder也有相同的組件,只需將Pascal語法轉(zhuǎn)換成C++語法,上面的代碼就完全可以用了。有興趣的朋友可與筆者進(jìn)一步交流其它XML應(yīng)用以及程序設(shè)計(jì)模式、J2EE開發(fā)、Rose UML建模等知識,記住我的E-Mail:nbDeveloper@hotmail.com。