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

VC++ 使用 MSXML DOM 操作 XML:建立、讀取、屬性存取完整範例

     編輯:VC 教學

環境需求

  • 安裝 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();
}</code></pre>

<h2>讀取 XML 文件(三種查詢方式)</h2>
<pre><code>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);
}</code></pre>

<h2>常用操作速查表</h2>
<table border="1" cellpadding="4" cellspacing="0">
  <tr><th>操作</th><th>方法/屬性</th><th>備註</th></tr>
  <tr><td>建立元素</td><td><code>createElement(bstrName)</code></td><td>回傳 <code>IXMLDOMElementPtr</code></td></tr>
  <tr><td>設定屬性</td><td><code>setAttribute(name, value)</code></td><td><code>value</code> 為 <code>_variant_t</code></td></tr>
  <tr><td>取得屬性</td><td><code>getAttribute(name)</code></td><td>回傳 <code>_variant_t</code></td></tr>
  <tr><td>設定文字內容</td><td><code>put_Text(bstrText)</code> 或 <code>text = bstr</code></td><td></td></tr>
  <tr><td>取得文字內容</td><td><code>get_Text()</code> 或 <code>text</code> 屬性</td><td>回傳 <code>BSTR</code></td></tr>
  <tr><td>附加子節點</td><td><code>appendChild(node)</code></td><td></td></tr>
  <tr><td>XPath 單節點</td><td><code>selectSingleNode(xpath)</code></td><td><code>//Book</code> 任意層級</td></tr>
  <tr><td>XPath 多節點</td><td><code>selectNodes(xpath)</code></td><td>回傳 <code>IXMLDOMNodeListPtr</code></td></tr>
  <tr><td>儲存檔案</td><td><code>save(variantPath)</code></td><td>路徑或 <code>IStream</code></td></tr>
  <tr><td>載入檔案</td><td><code>load(variantPath)</code></td><td>同步需設 <code>async = false</code></td></tr>
</table>

<h2>錯誤處理提示</h2>
<ul>
  <li>檢查 <code>pDoc->parseError->errorCode</code> 非 <code>S_OK</code> 時,取得 <code>reason</code>、<code>line</code>、<code>linepos</code> 進行診斷。</li>
  <li>大量資料建議使用 <code>SAX</code> ( <code>ISAXXMLReader</code> ) 流式解析,避免 DOM 佔用過多記憶體。</li>
  <li>命名空間 XML 需設定 <code>SelectionNamespaces</code> 屬性後再用 XPath。</li>
</ul>
							<div class="qcxs_ie_he"></div>
						</div>
						<div class="akevx_own"> <script language='javascript' src='/ad/p.js'></script></div>
						<div class="akevx_mj"> </div>	
						<div class="qcxs_ie_he"></div>
						
						<ol class="qmsbvx_hsb ovv_hex">
							<li>上一篇文章: <a class='LinkPrevArticle' href='https://code.yunyiwangluo.com/bianchen/vcjc/102144.html' >C 語言字串分割:strtok 與 strsep 差異與使用範例</a> <li>下一篇文章: <a class='LinkNextArticle' href='https://code.yunyiwangluo.com/bianchen/vcjc/102146.html'  >Visual Studio 除錯緩慢?關閉「載入符號」加速編譯啟動</a> 
						</ol>
					</div>
				</div>
				<div class="qirnxbd bg1 mt20">
					<div class="jdbsbav">
						<a href='https://code.yunyiwangluo.com/bianchen/vcjc/' target="_blank">VC 教學</a>
						<div class="jdbsbav_hx"></div>
					</div>
					<div class="qirnxbd_rbx">
						
						<div class="oiendx">
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/102773.html' target="_blank"><img  src='https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017011310321377_S.gif'  width='100' height='70' alt='VC++ ADO 動態管理 SQL Server 7 登入帳號與資料庫權限'  border='0'></a>
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/102773.html' target="_blank"><strong>VC++ ADO 動態管理 SQL Server 7 登入帳號與資料庫權限</strong></a>
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/102773.html' target="_blank"><p>架構
使用 ADO (`_ConnectionPtr`, `</p></a>			
						</div>
						
						<div class="oiendx">
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/118024.html' target="_blank"><img  src='https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017011412113616_S.jpg'  width='100' height='70' alt='打造位圖樣式進度條控制項 CBmpProgCtrl'  border='0'></a>
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/118024.html' target="_blank"><strong>打造位圖樣式進度條控制項 CBmpProgCtrl</strong></a>
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/118024.html' target="_blank"><p>參考遊戲《破天》更新介面,以前景/背景位圖繪製進度條,視覺效</p></a>			
						</div>
						
						<div class="oiendx">
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/134550.html' target="_blank"><img  src='https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017011611475281.jpg'  width='100' height='70' alt='C++ Builder 2007 安裝 ActiveX 控件完整圖文教程 (兩種方案)'  border='0'></a>
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/134550.html' target="_blank"><strong>C++ Builder 2007 安裝 ActiveX 控件完整圖文教程 (兩種方案)</strong></a>
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/134550.html' target="_blank"><p>背景
BCB2007 無法像 BCB6 直接透過 Compo</p></a>			
						</div>
						
						<div class="oiendx">
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/102333.html' target="_blank"><img  src='https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017011310272899_S.jpg'  width='100' height='70' alt='VC++ 深度解析 MFC 框架視窗建立流程 (二):CreateEx、PreCreateWindow 與視窗顯示'  border='0'></a>
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/102333.html' target="_blank"><strong>VC++ 深度解析 MFC 框架視窗建立流程 (二):CreateEx、PreCreateWindow 與視窗顯示</strong></a>
							<a href='https://code.yunyiwangluo.com/bianchen/vcjc/102333.html' target="_blank"><p>前言
承接上篇「MFC 框架視窗註冊與類別設計」,本文深入剖</p></a>			
						</div>
						
						<div class="qcxs_ie_he"></div>
					</div>
				</div>
			</div>
			<div class="eccsgxsg mt20">
				
				<div class="akevx_oin"> </div>	
				<div class="nenxnxb bg1 mt20">
					<div class="enxvsfgg">
						<div class="enxvsfgg_1"></div>
					</div>
					<div class="pdirbvx lbhevs ovv_hex">
						
						<a href='https://code.yunyiwangluo.com/bianchen/vcjc/134194.html' target="_blank">深入理解 C/C++ 中的 volatile 關鍵字與實測驗證</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/vcjc/134624.html' target="_blank">C/C++ 函式設計精要(一):參數與回傳值的介面設計規範</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/vcjc/102421.html' target="_blank">VC++ 繪製陰影文字效果:透明背景模式實作</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/vcjc/134358.html' target="_blank">Windows 服務開發深度解析 (三):控制處理器 (CtrlHandler) 完整指南</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/vcjc/102344.html' target="_blank">VC++ 深度解析 C++ 函數覆寫與隱藏:虛函數多態、隱藏規則、最佳實踐</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/vcjc/134331.html' target="_blank">C++Builder 註冊表操作完全指南:TRegistry 類別實戰</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/vcjc/134645.html' target="_blank">深度探索 C++ 對象模型(四):構造函數語義與編譯器合成機制</a>
						
					</div>
				</div>
			
				<div class="eqibneb bg1 mt20">
					<div class="lkebxsg">欄目導航</div>
					<div class="eqibneb_1 ovv_hex">
						<li><a class='childclass' href='https://code.yunyiwangluo.com/bianchen/vcplusjc/' target="_self">VC++</a></li>
<li><a class='childclass' href='https://code.yunyiwangluo.com/bianchen/gyvcplus/' target="_self">關於VC++</a></li>
<li><a class='childclass' href='https://code.yunyiwangluo.com/bianchen/vcjc/' target="_self">VC 教學</a></li>
					</div>
					
				</div>
			</div>
			<div class="qcxs_ie_he"></div>
		</div>
	</div>
		<div class="qcxs_ie_he"></div>
	<div class="ebrxbsbf">Copyright © <a href="https://code.yunyiwangluo.com/" target="_blank" title="程式碼之家">程式碼之家</a> All Rights Reserved   </div>


</body>
</html>