首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder 6 中操作 XML 的實戰指南

     編輯:關於C++

在 CSDN 論壇上,經常有開發者詢問如何在 C++ Builder 中使用 XML。乍看之下,這似乎不成問題:XML 常與網路、SOAP/Web Service 掛鉤,而 C++ Builder 內建 TXMLDocument 元件,理應輕鬆上手。然而,當筆者近期研究 Tomcat 發現其設定檔採用 XML,決定嘗試用 C++ Builder 操作 XML 以提升軟體專業度時,才真切體會到提問者的困惑——TXMLDocument 確實不好用。若無 ASP+XML 建站經驗,極易在這裡栽跟頭。本文將以一個定時提醒日程小程式為例,詳細說明如何用 DOM 模型處理 XML。

為什麼選擇 DOM 模型?

XML 解析器主要分 SAX 和 DOM 兩類。SAX 為事件驅動,較簡單;DOM 則將整個 XML 載入記憶體形成樹狀結構,操作較複雜。C++ Builder 的 TXMLDocument 採用 MSXML DOM(基於 COM),在 VB 中呼叫 COM 很容易,但在 C++ Builder 中,開發者習慣 VCL 直觀的類設計,面對 COM 風格的介面往往無從下手,甚至陷入文檔陷阱。

範例場景:日程提醒程式

假設其他功能已完成,需將日程資料以 XML 格式儲存。基本操作包含新增、刪除、讀取,涵蓋 XML 處理的核心場景。

XML 結構設計 (tip.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,掌握後易擴展至複雜格式。

核心程式碼實作

1. 載入 XML 並填充列表

XMLDoc->LoadFromFile(WideString(PathString(AppPath) + "Tip.xml"));
XMLDoc->Active = true;
FillList(); // 將 XML 內容顯示於 ListView

2. 讀取 XML 內容

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 處理中文。

3. 新增節點

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 結構即易理解。

4. 刪除節點

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 結構的處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved