MFC中讀取寫入XML文件

第一步:新建一個對話框工程,在對話框上添加一個按鈕《連接》和一個ComboBox下拉框,如圖所示(注意:本次的按鈕《斷開》和按鈕《保存圖片》沒有用到)

第二步:添加頭文件

#import "msxml6.dll"
using namespace MSXML2;
注意:若提示無法打開源文件“msxml6.tlh”,只需要重新生成解決方案即可。

第三步:在***Dlg.h頭文件中添加兩個變量

	MSXML2::IXMLDOMDocumentPtr XMLDoc;
	MSXML2::IXMLDOMElementPtr XMLURL;

第四步:在OnInitDialog()中添加以下代碼,在代碼讀取XML文件,若XML文件存在,則不創建,並把XML文件裏邊的內容添加到ComboBox中;若不存在,則創建一個XML文件,並往裏邊寫入一個初始化數據,並添加到ComboBox中
	HRESULT HR = XMLDoc.CreateInstance(_uuidof(MSXML2::DOMDocument60));
 	if (!SUCCEEDED(HR))
 	{
 		 MessageBox("faild!!");
  		return 0;
 	}
	if (!XMLDoc->load("URL.XML")){
		XMLURL = XMLDoc->createElement("ROOT");
		XMLURL->setAttribute("URL", "Address"); //設置根標籤的屬性;  
		XMLDoc->appendChild(XMLURL);
		CString TMP;
		MSXML2::IXMLDOMElementPtr XMLNODE;
		for (int I = 0; I<1; I++)
		{
			TMP.Format("%d", I + 1);
			XMLNODE = XMLDoc->createElement((_bstr_t)("URL" + TMP));
			XMLNODE->setAttribute("URL", (_variant_t)"rtsp://172.16.1.122:554/av0_1");//設置標籤的屬性及內容;  
			XMLURL->appendChild(XMLNODE);
		}
		XMLDoc->save("URL.XML");
		XMLNODE.Release();
		m_URLComboBox.AddString("rtsp://172.16.1.122:554/av0_1");
		return 0;
	}
	//把xml文件中的URL地址添加到combox控件中
	MSXML2::IXMLDOMNodeListPtr nodelist = NULL;
	XMLURL = XMLDoc->GetdocumentElement();
	XMLURL->get_childNodes(&nodelist);		//獲取根節點的所有子節點
	long XMLNODESNUM;
	nodelist->get_length(&XMLNODESNUM);		//子節點的個數
	MSXML2::IXMLDOMNodePtr subnode;
	MSXML2::IXMLDOMNamedNodeMapPtr XMLNODEATTS;
	long ATTSNUM;
	//遍歷所有子節點
	for (int i = 0; i < XMLNODESNUM; i++){
		nodelist->get_item(i, &subnode);		//獲取一個子節點
		subnode->get_attributes(&XMLNODEATTS);	//獲取子節點的屬性
		XMLNODEATTS->get_length(&ATTSNUM);		//獲取屬性的個數
		for (int j = 0; j < ATTSNUM; j++){		//遍歷屬性
			XMLNODEATTS->get_item(j, &subnode);	//獲取一個屬性
			CString url = (char*)(_bstr_t)subnode->nodeName;	//獲取屬性的名字
			CString addr = (char*)(_bstr_t)subnode->text;		//獲取屬性的內容
			m_URLComboBox.AddString(addr);
		}
	}
	subnode.Release();
	XMLNODEATTS.Release();

第五步:在了《連接》按鈕中添加以下代碼,代碼說明如下
1、先獲取ComboBox列表框選中項的索引
2、獲取ComboBox內容
3、若ComboBox內容爲空,則返回,重新輸入
4、若索引爲-1,則判斷ComboBox中的內容是否與XML中存在,如果不存在,則添加到XML文件中,若存在,則跳過,往下執行
	UpdateData(TRUE);
	//獲取ComboBox的內容
	CString mURL;
	int nSel;
	nSel = m_URLComboBox.GetCurSel();	//獲取ComboBox列表框中選中項的索引
	GetDlgItemText(IDC_COMBO_URL, mURL);
	if (mURL == ""){
		AfxMessageBox("請先輸入rtsp攝像頭網絡地址!");
		return;
	}
	BOOL isExist = FALSE;
	if (nSel == -1){		//若新輸入地址
		//把新URL地址添加到XML
		MSXML2::IXMLDOMNodeListPtr nodelist = NULL;
		XMLURL = XMLDoc->GetdocumentElement();
		XMLURL->get_childNodes(&nodelist);		//獲取根節點的所有子節點
		long XMLNODESNUM;
		nodelist->get_length(&XMLNODESNUM);		//子節點的個數
		MSXML2::IXMLDOMNodePtr subnode;
		MSXML2::IXMLDOMNamedNodeMapPtr XMLNODEATTS;
		long ATTSNUM;
		CArray<CString, CString> URLList;
		//遍歷所有子節點
		for (int i = 0; i < XMLNODESNUM; i++){
			nodelist->get_item(i, &subnode);		//獲取一個子節點
			subnode->get_attributes(&XMLNODEATTS);	//獲取子節點的屬性
			XMLNODEATTS->get_length(&ATTSNUM);		//獲取屬性的個數
			for (int j = 0; j < ATTSNUM; j++){		//遍歷屬性
				XMLNODEATTS->get_item(j, &subnode);	//獲取一個屬性
				CString url = (char*)(_bstr_t)subnode->nodeName;	//獲取屬性的名字
				CString addr = (char*)(_bstr_t)subnode->text;		//獲取屬性的內容
				URLList.Add(addr);
			}
		}
		subnode.Release();
		XMLNODEATTS.Release();
		for (int i = 0; i < URLList.GetSize(); i++)
		{
			if (URLList[i] != mURL)
				continue;
			isExist == TRUE;
		}
		if (!isExist){		//如果新輸入的URL不存在
			CString TMP;
				MSXML2::IXMLDOMElementPtr XMLNODE;
				TMP.Format("%d", URLList.GetSize() + 1);
				XMLNODE = XMLDoc->createElement((_bstr_t)("URL" + TMP));
				XMLNODE->setAttribute("URL", (_variant_t)mURL);//設置標籤的屬性及內容;  
				XMLURL->appendChild(XMLNODE);
				XMLDoc->save("URL.XML");
				XMLNODE.Release();
				m_URLComboBox.AddString(mURL);
		}
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章