環境需求
- 安裝 MSXML 4.0/6.0(SDK 包含
msxml.h、msxml.lib)。
- 專案設定:
#import rename_namespace("MSXML2") 或包含標頭檔連結 msxml2.lib。
- 啟用 COM:
CoInitialize(NULL) / CoUninitialize()。
建立 XML 文件(寫入)
void CreateXml()
{
HRESULT hr = CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr pDoc;
hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
if (FAILED(hr)) { AfxMessageBox(_T("建立 DOMDocument 失敗")); return; }
// 根節點
MSXML2::IXMLDOMElementPtr pRoot = pDoc->createElement(_bstr_t("Book"));
pRoot->setAttribute(_bstr_t("id"), _variant_t("123"));
pDoc->appendChild(pRoot);
// 子節點
MSXML2::IXMLDOMElementPtr pNode = pDoc->createElement(_bstr_t("Author"));
pNode->put_Text(_bstr_t("張三"));
pRoot->appendChild(pNode);
// 子節點
pNode = pDoc->createElement(_bstr_t("Title"));
pNode->put_Text(_bstr_t("XML 入門"));
pRoot->appendChild(pNode);
// 儲存
pDoc->save(_variant_t("D:\\book.xml"));
CoUninitialize();
}
讀取 XML 文件(三種查詢方式)
void ReadXml()
{
MSXML2::IXMLDOMDocumentPtr pDoc;
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
pDoc->async = VARIANT_FALSE; // 同步載入
pDoc->load(_variant_t("D:\\book.xml"));
// 方式一:XPath 查詢根節點
MSXML2::IXMLDOMNodePtr pBook = pDoc->selectSingleNode(_bstr_t("//Book"));
// 方式二:直接取 DocumentElement
// MSXML2::IXMLDOMElementPtr pRoot = pDoc->documentElement;
// 取屬性 id
_variant_t varId = pBook->getAttribute(_bstr_t("id"));
CString strId = (LPCTSTR)_bstr_t(varId);
// 取子節點文字
MSXML2::IXMLDOMNodePtr pAuthor = pBook->selectSingleNode(_bstr_t("Author"));
MSXML2::IXMLDOMNodePtr pTitle = pBook->selectSingleNode(_bstr_t("Title"));
CString strAuthor = (LPCTSTR)pAuthor->text;
CString strTitle = (LPCTSTR)pTitle->text;
// 顯示結果
AfxMessageBox(_T("ID: ") + strId + _T("\nAuthor: ") + strAuthor + _T("\nTitle: ") + strTitle);
}
常用操作速查表
| 操作 | 方法/屬性 | 備註 |
| 建立元素 | createElement(bstrName) | 回傳 IXMLDOMElementPtr |
| 設定屬性 | setAttribute(name, value) | value 為 _variant_t |
| 取得屬性 | getAttribute(name) | 回傳 _variant_t |
| 設定文字內容 | put_Text(bstrText) 或 text = bstr | |
| 取得文字內容 | get_Text() 或 text 屬性 | 回傳 BSTR |
| 附加子節點 | appendChild(node) | |
| XPath 單節點 | selectSingleNode(xpath) | //Book 任意層級 |
| XPath 多節點 | selectNodes(xpath) | 回傳 IXMLDOMNodeListPtr |
| 儲存檔案 | save(variantPath) | 路徑或 IStream |
| 載入檔案 | load(variantPath) | 同步需設 async = false |
錯誤處理提示
- 檢查
pDoc->parseError->errorCode 非 S_OK 時,取得 reason、line、linepos 進行診斷。
- 大量資料建議使用
SAX ( ISAXXMLReader ) 流式解析,避免 DOM 佔用過多記憶體。
- 命名空間 XML 需設定
SelectionNamespaces 屬性後再用 XPath。