在 CSDN 論壇上,經常有開發者詢問如何在 C++ Builder 中使用 XML。乍看之下,這似乎不成問題:XML 常與網路、SOAP/Web Service 掛鉤,而 C++ Builder 內建 TXMLDocument 元件,理應輕鬆上手。然而,當筆者近期研究 Tomcat 發現其設定檔採用 XML,決定嘗試用 C++ Builder 操作 XML 以提升軟體專業度時,才真切體會到提問者的困惑——TXMLDocument 確實不好用。若無 ASP+XML 建站經驗,極易在這裡栽跟頭。本文將以一個定時提醒日程小程式為例,詳細說明如何用 DOM 模型處理 XML。
XML 解析器主要分 SAX 和 DOM 兩類。SAX 為事件驅動,較簡單;DOM 則將整個 XML 載入記憶體形成樹狀結構,操作較複雜。C++ Builder 的 TXMLDocument 採用 MSXML DOM(基於 COM),在 VB 中呼叫 COM 很容易,但在 C++ Builder 中,開發者習慣 VCL 直觀的類設計,面對 COM 風格的介面往往無從下手,甚至陷入文檔陷阱。
假設其他功能已完成,需將日程資料以 XML 格式儲存。基本操作包含新增、刪除、讀取,涵蓋 XML 處理的核心場景。
<?xml version="1.0" encoding="GB2312"?>
<VTip>
<Tip>
<Mode>0</Mode>
<Time>2003/4/25?08:01:46</Time>
<Content>洗衣服</Content>
</Tip>
<Tip>
<Mode>1</Mode>
<Time>2003/4/25?PM 17:30:00</Time>
<Content>陪女朋友吃飯</Content>
</Tip>
</VTip>
採用 GB2312 編碼避免中文亂碼。結構規範,無屬性與 DOCTYPE,掌握後易擴展至複雜格式。
XMLDoc->LoadFromFile(WideString(PathString(AppPath) + "Tip.xml"));
XMLDoc->Active = true;
FillList(); // 將 XML 內容顯示於 ListView
void __fastcall Tfrmmain::FillList()
{
lstMain->Items->BeginUpdate();
lstMain->Items->Clear();
_di_IXMLNode node = XMLDoc->DocumentElement; // 取得根節點 VTip
_di_IXMLNodeList nodes = node->ChildNodes; // 取得子節點清單
for (int n = 0; n < nodes->Count; n++)
{
TListItem* li = lstMain->Items->Add();
// 依序取得 Mode, Time, Content
node = nodes->Nodes[n]->ChildNodes->Nodes[0];
int m = String(node->GetText()).ToInt();
li->Caption = "";
li->ImageIndex = m + 5;
li->SubItems->Add(nodes->Nodes[n]->ChildNodes->Nodes[1]->GetText());
li->SubItems->Add(nodes->Nodes[n]->ChildNodes->Nodes[2]->GetText());
}
lstMain->Items->EndUpdate();
}
關鍵點:DocumentElement 取得根節點,ChildNodes 取得子節點集合,GetText() 取得節點文字內容,需轉為 WideString 處理中文。
bool __fastcall Tfrmmain::AddTask(int m, TDateTime& date, TDateTime& time, String con)
{
_di_IXMLNode node = XMLDoc->DocumentElement;
node = node->AddChild(WideString("Tip")); // 新增 Tip 節點
_di_IXMLNode subnode = node->AddChild(WideString("Mode"));
subnode->SetText(WideString(m));
subnode = node->AddChild(WideString("Time"));
subnode->SetText(WideString(date.DateString() + "?" + time.TimeString()));
subnode = node->AddChild(WideString("Content"));
subnode->SetText(WideString(con));
return true;
}
AddChild 建立子節點,SetText 設定文字內容,對照 XML 結構即易理解。
int ind = lstMain->Selected->Index; // 取得選取項目索引
_di_IXMLNode node = XMLDoc->DocumentElement;
int re = node->ChildNodes->Delete(ind);
if (re != -1)
lstMain->Items->Delete(ind);
ChildNodes->Delete(index) 移除指定索引節點,回傳 -1 表示失敗。

透過 TXMLDocument 搭配 MSXML DOM,雖然初期學習曲線較陡,但掌握 DocumentElement、ChildNodes、AddChild/SetText、Delete 等核心介面後,即可完成 XML 的增刪查改。建議開發者多查閱 MSXML 文檔,並結合實際專案練習,逐步駕馭複雜 XML 結構的處理。