VC MSXML 操做 XML 入門

    最近對XML有了些興趣,準備稍稍涉獵一下。百度了相關的文章,試着寫了一個程序,記錄下來以資備忘。html

    個人開發環境:Win7 32位OS、VS2012。
windows


    OK,開始動手。
app

    PS:至於相關理論之類的就讓大神大仙大俠大牛們去操心吧,我麼就秉承拿來主義,能用就行啦。
ide


    啓動Visual Studio 2012。
測試

    【文件】→【新建】→【項目】
ui

    wKiom1StKxLBSKHfAAIyhRVrVOE622.jpg

    新建一個「MfcXmlTest」的MFC項目。【肯定】
spa

    wKiom1StK8jis03TAAIEopXwIlo695.jpg

    【下一步】
.net

    wKioL1StLaPhp8hZAAJa7Yikw2g809.jpg

    選中「基於對話框」,取消「使用Unicode庫」。可直接【完成】
調試

    PS:Unicode對中文支持不是很好。
code

    

    熱身完成,開始進入正題。

    先畫一個簡單的程序界面。

    wKiom1SuKkejTycuAABpDYpiquY068.jpg

    裏面添加了中文,測試是否對中文支持。

    各控件屬性:

控件ID 變量類型
變量名稱
IDC_EDIT_ID CString m_strId
IDC_EDIT_BOOK CString m_strBook
IDC_EDIT_AUTHOR CString m_strAuthor
IDC_BUTTON_GENERATE 生成XML
IDC_BUTTON_LOAD 加載XML


    進入代碼編寫階段。

    在StdAfx.h中引入動態連接庫 MSXML6.DLL(C:/windows/system32/msxml6.dll)

    可在文件最後添加:

// Win7系統自帶MSXML6版本,不一樣OS請依照對應的版本,也可自行安裝
#import <msxml6.dll>


    雙擊「生成XML」按鈕,完成以下代碼:

// 按鈕:生成XML
void CMfcXmlTestDlg::OnBnClickedButtonGenerate()
{
	// TODO: 在此添加控件通知處理程序代碼

	UpdateData(TRUE);
	MSXML2::IXMLDOMDocumentPtr pDoc;					// xml文檔
	MSXML2::IXMLDOMElementPtr xmlRoot;					// 根節點
	MSXML2::IXMLDOMElementPtr pElement, pElement1;		// 元素
	MSXML2::IXMLDOMNodePtr pNode=NULL;					// 節點
	MSXML2::IXMLDOMProcessingInstructionPtr pProInstruction = NULL;		// xml聲明

	// 建立DOMDocument對象
	HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));	// MSXML6版本
	if (!SUCCEEDED(hr))
	{
		MessageBox("沒法建立DOMDocument對象,請檢查是否安裝了MS XML Parser 運行庫!");
		return;
	}

	// 建立xml文檔聲明:<?xml version="1.0" encoding="utf-8"?>
	pProInstruction = pDoc->createProcessingInstruction((_bstr_t)(char*)"xml", (_bstr_t)(char*)"version=\"1.0\" encoding=\"utf-8\"");
	pDoc->appendChild(pProInstruction);

	// 根節點的名稱爲:圖書館
	xmlRoot = pDoc -> createElement((_bstr_t)"圖書館");
	pDoc -> PutRefdocumentElement(xmlRoot);


/*	-------- 運行結果 --------
	<?xml version="1.0" encoding="utf-8"?>
	<圖書館>
	  <Book ID="321">
		<書名>BookName</書名>
		<做者>BookAuthor</做者>
	  </Book>
	</圖書館>
*/
	// 節點的名稱爲Book
	pElement = pDoc -> createElement((_bstr_t)"Book");
	// 設置屬性
	pElement -> setAttribute( "ID" ,( const char * )m_strId);
	xmlRoot -> appendChild(pElement);

	// 添加「書名」元素
	pElement1 = pDoc -> createElement((_bstr_t) "書名" );
	pElement1 -> Puttext((_bstr_t)( const char * )m_strBook);
	pElement -> appendChild(pElement1);

	// 添加「做者」元素
	pElement1 = pDoc -> createElement( "做者" );
	pElement1 -> Puttext(( const   char   * )m_strAuthor);
	pElement -> appendChild(pElement1);


/*	-------- 運行結果 --------
	<圖書館>
	  <Book>
		<ID>123</ID>
		<書名>BookName</書名>
		<做者>BookAuthor</做者>
	  </Book>
	</圖書館>

	// 添加「Book」節點
	pNode = pDoc->createNode((_variant_t)(long)NODE_ELEMENT, (_bstr_t)(char*)"Book", (_bstr_t)(char*)"");
	xmlRoot -> appendChild(pNode);

	// 添加「ID」元素
	pElement = pDoc -> createElement((_bstr_t) "ID" );
	pElement -> Puttext((_bstr_t)( const char * )m_strId);
	pNode -> appendChild(pElement);

	// 添加「書名」元素
	pElement = pDoc -> createElement((_bstr_t) "書名" );
	pElement -> Puttext((_bstr_t)( const char * )m_strBook);
	pNode -> appendChild(pElement);

	// 添加「做者」元素
	pElement = pDoc -> createElement( "做者" );
	pElement -> Puttext(( const   char   * )m_strAuthor);
	pNode -> appendChild(pElement);
*/

	// 保存到文件。若是不存在就創建,存在就覆蓋
	pDoc -> save("d://Book.xml");
}


    雙擊「加載XML」按鈕,完成以下代碼:

// 按鈕:加載XML
void CMfcXmlTestDlg::OnBnClickedButtonLoad()
{
	// TODO: 在此添加控件通知處理程序代碼

/*	-------- XML 內容 --------
	<?xml version="1.0" encoding="utf-8"?>
	<圖書館>
	  <Book ID="321">
		<書名>BookName</書名>
		<做者>BookAuthor</做者>
	  </Book>
	</圖書館>
*/

	// 清空控件內容
	m_strId.Empty();
	m_strBook.Empty();
	m_strAuthor.Empty();
	UpdateData(FALSE);								// 變量值—>控件顯示

	MSXML2::IXMLDOMDocumentPtr pDoc;
	HRESULT hr;

	hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
	if (FAILED(hr))
	{
		MessageBox("沒法建立DOMDocument對象,請檢查是否安裝了MS XML Parser 運行庫!");
		return;
	}
	
	// 加載文件
	pDoc -> load("d://Book.xml");

	// 選擇內容的根節點
	MSXML2::IXMLDOMElementPtr pElem = NULL;
	pElem = pDoc -> selectSingleNode("//圖書館");
	if(pElem==NULL)
	{
		return;
	}

	// 搜索「圖書館」中「Book」的數量(本例只有一本)
	int nBookNum = pElem->childNodes->length;
	if( nBookNum == 0)
	{
		return;
	}

	// 遍歷全部Book
	for(int i=0; i < nBookNum; i++)
	{
		MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i];
		if(pBookNode==NULL)
		{
			return;
		}

		//讀取Book節點的「ID」屬性
		MSXML2::IXMLDOMNodePtr pId = pBookNode->attributes->getNamedItem("ID");
		m_strId=(LPCTSTR)pId->text;					// 類型轉換 _bstr_t → CString

		//讀取book節點下「書名」子節點
		MSXML2::IXMLDOMNodePtr pBook = pBookNode->selectSingleNode("書名");
		if(pBook==NULL)
		{
			//cout<<"Author: Error\t";
		}
		else
		{
			m_strBook=(LPCTSTR)pBook->text;
		}

		//讀取book節點下「做者」子節點
		MSXML2::IXMLDOMNodePtr pAuthor = pBookNode->selectSingleNode("做者");
		if(pAuthor==NULL)
		{
			//cout<<"Author: Error\t";
		}
		else
		{
			m_strAuthor=(LPCTSTR)pAuthor->text;
		}
	}	// for(int i=0; i < nBookNum; i++)

	UpdateData(FALSE);
}


    到了激動人心的最終時刻啦!

    按下F7生成程序,若是一切順利,再按下F5走起。

    運行效果如圖:

    wKioL1SuO8XByHE9AADd8VQ4J_s488.jpg

    \(≧▽≦)/~啦啦啦t_0003.gif


    本人調試的時候也蹦出了一個異常:

    wKioL1SuPLrgfum1AACAMC3LYZU086.jpg

    仔細看去,原來是MSXML的版本沒有改成本身電腦的MSXML6版本。望諸位留意。


PS:參考了很多網友的大做,一併表示感謝!

http://blog.csdn.net/max2008/article/details/1647613

http://www.newxing.com/Tech/Program/Cpp/703.html

http://www.cnblogs.com/xiaoyusmile/p/3920075.html

相關文章
相關標籤/搜索