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

使用 MSXML DOM 解析器處理 XML 文件:載入、查詢、插入節點與屬性完整範例

     編輯:關於VC++

MSXML 是 Microsoft 提供的高效能 XML DOM 解析器,透過 COM 介面操作 XML 文件樹。本文以主控台應用程式為例,示範載入 XML、XPath 查詢節點、建立子節點與屬性、提取文字內容、儲存修改後文件的完整流程,採用 ATL 智慧指標簡化 COM 資源管理。

範例 XML 資料 xmldata.xml


<?xml version="1.0"?>
<xmldata>
  <xmlnode />
  <xmltext>Hello, World!</xmltext>
</xmldata>

核心步驟與代碼

  1. 初始化 COM 與建立解析器

::CoInitialize(NULL);
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
if (FAILED(hr) || !spXMLDOM) throw "Unable to create XML parser";
  1. 載入 XML 文件

VARIANT_BOOL bSuccess = FALSE;
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"), &bSuccess);
if (FAILED(hr) || !bSuccess) throw "Unable to load XML document";
  1. XPath 查詢單一節點 xmlnode

CComPtr<IXMLDOMNode> spXMLNode;
hr = spXMLDOM->selectSingleNode(CComBSTR(L"xmldata/xmlnode"), &spXMLNode);
if (FAILED(hr) || !spXMLNode) throw "Unable to locate 'xmlnode'";
  1. 建立子節點 xmlchildnode 並附加屬性 xml="fun"

CComPtr<IXMLDOMNode> spChildNode;
hr = spXMLDOM->createNode(CComVariant(NODE_ELEMENT), CComBSTR(L"xmlchildnode"), NULL, &spChildNode);
if (FAILED(hr) || !spChildNode) throw "Unable to create child node";

CComPtr<IXMLDOMNode> spInserted;
hr = spXMLNode->appendChild(spChildNode, &spInserted);

// 切換至 IXMLDOMElement 設定屬性
CComQIPtr<IXMLDOMElement> spElement = spInserted;
if (!spElement) throw "Query IXMLDOMElement failed";
hr = spElement->setAttribute(CComBSTR(L"xml"), CComVariant(L"fun"));
  1. 查詢 xmltext 並提取文字內容

CComPtr<IXMLDOMNode> spTextNode;
hr = spXMLDOM->selectSingleNode(CComBSTR(L"xmldata/xmltext"), &spTextNode);
CComVariant varValue;
hr = spTextNode->get_nodeTypedValue(&varValue);
if (SUCCEEDED(hr) && varValue.vt == VT_BSTR) {
    USES_CONVERSION;
    cout << W2T(varValue.bstrVal) << endl;   // 輸出 Hello, World!
}
  1. 儲存修改後文件

hr = spXMLDOM->save(CComVariant(L"updatedxml.xml"));
if (FAILED(hr)) throw "Unable to save updated XML";

輸出 updatedxml.xml


<?xml version="1.0"?>
<xmldata>
  <xmlnode>
    <xmlchildnode xml="fun" />
  </xmlnode>
  <xmltext>Hello, World!</xmltext>
</xmldata>

關鍵介面對照表

DOM 介面MSXML COM 介面主要用途
DocumentIXMLDOMDocument載入、儲存、XPath 查詢、建立節點
NodeIXMLDOMNode樹狀導航、appendChild、get_nodeTypedValue
ElementIXMLDOMElementsetAttribute、getAttribute
NodeListIXMLDOMNodeList批次迭代節點集合

實務提醒

  • 大型 XML 請考慮 SAX(ISAXXMLReader)流式解析,避免完整 DOM 樹佔用過多記憶體。
  • 命名空間查詢需使用 SelectionNamespaces 屬性註冊前綴。
  • 錯誤處理:IXMLDOMParseError 提供詳細行號、錯誌代碼與原因描述。

MSXML 功能強大且成熟,搭配 ATL 智慧指標可編寫健壯、無記憶體洩漏的 XML 處理代碼。

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