XML (eXtensible Markup Language) 自推出以來便成為資料交換的標準格式。Borland Delphi 從 6.0 版起內建 XML 元件包,採用 Microsoft MSXML DOM 解析器,不僅符合標準,對中文元素名稱與屬性的支援也大幅優於舊版的 XMLParser。本文將透過一個完整的「學生花名冊」範例,帶領讀者快速掌握 Delphi 中 XML 的讀取與寫入操作。
我們將操作的 Input.xml 採用 Big5/GB2312 編碼,結構如下:
<?xml version="1.0" encoding="GB2312"?>
<學生花名冊>
<學生 性別="男">
<姓名>李華</姓名>
<年齡>14</年齡>
<電話>6287555</電話>
</學生>
<學生 性別="男">
<姓名>張三</姓名>
<年齡>16</年齡>
<電話>8273425</電話>
</學生>
</學生花名冊>
對應的 Delphi 資料結構定義:
type
TStudent = class
sex : string; // 學生性別
name : string; // 學生姓名
age : integer; // 學生年齡
phone: string; // 電話號碼
end;
在表單上放置兩個 TXMLDocument 元件 (位於 Internet 分頁):
Input.xml。Output.xml。另加一個按鈕 Button1,所有邏輯寫在其 OnClick 事件中。
var
Root, Parent_Node, Child_Node: IXMLNode;
Student: TStudent;
List: TList;
i: Integer;
begin
List := TList.Create;
try
InXMLDoc.LoadFromFile('Input.xml');
Root := InXMLDoc.DocumentElement; // 取得根節點 <學生花名冊>
Parent_Node := Root.ChildNodes.First;
while Parent_Node <> nil do
begin
if Parent_Node.NodeName = '學生' then
begin
Student := TStudent.Create;
Student.sex := Parent_Node.Attributes['性別'];
Child_Node := Parent_Node.ChildNodes.First;
while Child_Node <> nil do
begin
if Child_Node.NodeName = '姓名' then
Student.name := Child_Node.Text
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;
end;
List.Add(Student);
end;
Parent_Node := Parent_Node.NextSibling;
end;
// 此時 List 包含所有學生物件,可供後續處理
finally
// 注意:List 內的物件需在寫入 XML 後再釋放
end;
OutXMLDoc.Active := True; // 啟用文件,自動建立空白 DOM
OutXMLDoc.Encoding := 'GB2312';
Root := OutXMLDoc.AddChild('學生花名冊'); // 建立根節點
for i := 0 to List.Count - 1 do
begin
Student := TStudent(List.Items[i]);
if Student <> nil then
begin
Parent_Node := Root.AddChild('學生');
Parent_Node.Attributes['性別'] := Student.sex;
Child_Node := Parent_Node.AddChild('姓名');
Child_Node.Text := Student.name;
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');
OutXMLDoc.Active := False;
// 釋放資源
for i := 0 to List.Count - 1 do
TStudent(List.Items[i]).Free;
List.Free;
Delphi 的 TXMLDocument 封裝了 MSXML COM 介面,C++Builder 同樣擁有相同元件,只需將 Pascal 語法轉為 C++ 即可直接套用上述邏輯。
透過 IXMLNode 介面操作節點、屬性與文字內容,Delphi 處理 XML 既直觀又強大。掌握「載入 → 走訪節點 → 解析資料 → 建立新節點 → 存檔」的基本流程,即可應付大多數 XML 資料交換需求。