最近對XML有了些興趣,準備稍稍涉獵一下。百度了相關的文章,試着寫了一個程序,記錄下來以資備忘。html
個人開發環境:Win7 32位OS、VS2012。
windows
OK,開始動手。
app
PS:至於相關理論之類的就讓大神大仙大俠大牛們去操心吧,我麼就秉承拿來主義,能用就行啦。
ide
啓動Visual Studio 2012。
測試
【文件】→【新建】→【項目】
ui
新建一個「MfcXmlTest」的MFC項目。【肯定】
spa
【下一步】
.net
選中「基於對話框」,取消「使用Unicode庫」。可直接【完成】
調試
PS:Unicode對中文支持不是很好。
code
熱身完成,開始進入正題。
先畫一個簡單的程序界面。
裏面添加了中文,測試是否對中文支持。
各控件屬性:
控件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走起。
運行效果如圖:
本人調試的時候也蹦出了一個異常:
仔細看去,原來是MSXML的版本沒有改成本身電腦的MSXML6版本。望諸位留意。
PS:參考了很多網友的大做,一併表示感謝!
http://blog.csdn.net/max2008/article/details/1647613