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);
		}
	}



  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值