msxml应用

 
递归获取basename为menuTrans的节点的数据,xmllist为xmlconfig的list
#import "msxml3.dll"
using namespace MSXML2;
#define MENUMARK "menuTrans"
void dataConfig::ReadXmlRoot(MSXML2::IXMLDOMNodePtr XMLNODE)
{
	MSXML2::IXMLDOMNodeListPtr XMLNODES; 
	MSXML2::IXMLDOMNodePtr XMLCHILDNODE;
	MSXML2::IXMLDOMNamedNodeMapPtr XMLNODEATTS;//某个节点的所有属性;
	long XMLNODESNUM,ATTSNUM;
	//判断是注释的话跳过
	if(MSXML2::NODE_COMMENT  == XMLNODE->GetnodeType())
	{
		return;
	}
	
	CString itemtext = (_bstr_t)XMLNODE->GetbaseName();
	//判断非menu节点的话跳过
	if(CString(MENUMARK) == itemtext)
	{	
		XMLNODE->get_attributes(&XMLNODEATTS);//获得某个节点的所有属性;
		XMLNODEATTS->get_length(&ATTSNUM);//获得所有属性的个数;
		struct xmlconfig xmldata;
		xmldata.cmenu = new CXPMenu();
		for(int J=0;J<ATTSNUM;J++)
		{
			XMLNODEATTS->get_item(J,&XMLNODE);//获得某个属性;
			CString T1 = (_bstr_t)XMLNODE->nodeName;
			CString T2 = (_bstr_t)XMLNODE->text;
			
			if(T1 == CString("queuecode"))
			{
				xmldata.queuecode = T2;
				continue;
			}
			if(T1 == CString("text"))
			{
				//MessageBox(NULL,T1+_T("===")+T2,_T("标题"),MB_OK);
				xmldata.text = T2;
				continue;
			}
			if(T1 == CString("id"))
			{
				xmldata.id = T2;
				continue;
			}
			if(T1 == CString("pid"))
			{
				xmldata.pid = T2;
				continue;
			}
		}
		xmllist.push_back(xmldata);

	}

	XMLNODE->get_childNodes(&XMLNODES); //获得根节点的所有子节点;
	XMLNODES->get_length(&XMLNODESNUM); //获得所有子节点的个数;

	for(int I=0;I<XMLNODESNUM;I++)
	{
		XMLNODES->get_item(I,&XMLCHILDNODE);
		ReadXmlRoot(XMLCHILDNODE);
		if(XMLCHILDNODE)
		{
			XMLCHILDNODE.Release();
		}
	}

	if(XMLNODEATTS)
	{
		XMLNODEATTS.Release();
	}

	if(XMLNODES)
	{
		XMLNODES.Release();
	}
}
BOOL dataConfig::writeXmlData(const char * xml_path)
{
	::CoInitialize(NULL);
	MSXML2::IXMLDOMDocumentPtr XMLDOC; 
	MSXML2::IXMLDOMElementPtr XMLROOT;
	MSXML2::IXMLDOMElementPtr XMLELEMENT;
	MSXML2::IXMLDOMNodeListPtr XMLNODES; //某个节点的所以字节点
	MSXML2::IXMLDOMNodePtr XMLNODE;
	HRESULT HR = XMLDOC.CreateInstance(_uuidof(MSXML2::DOMDocument30));
	if(!SUCCEEDED(HR))
	{
		//MessageBox(NULL,_T("xml read faild."),_T("标题"),MB_OK);
		LOGGER->log(LOG_ERR,"writeXmlData error.");
		return false;
	}
	
	list<struct xmlconfig>::iterator iter;
	iter = xmllist.begin();
	for(;iter != xmllist.end();++iter)
	{
		if(NULL != iter->cmenu)
		{
			delete iter->cmenu;
			iter->cmenu = NULL;
			break;
		}
	}
	xmllist.clear();
	
	XMLDOC->load(xml_path);
	XMLROOT = XMLDOC->GetdocumentElement();//获得根节点;
	XMLROOT->get_childNodes(&XMLNODES);//获得根节点的所有子节点;
	long XMLNODESNUM;
	XMLNODES->get_length(&XMLNODESNUM);//获得所有子节点的个数;
	
	for(int I=0;I<XMLNODESNUM;I++)
	{
		
		XMLNODES->get_item(I,&XMLNODE);//获得某个子节点;
		ReadXmlRoot(XMLNODE);   //递归获取xml配置
	}

	if(XMLNODES)
	{
		XMLNODES.Release();
	}
	if(XMLNODE)
	{
		XMLNODE.Release();
	}
	if(XMLROOT)
	{
		XMLROOT.Release();
	}
	if(XMLDOC)
	{
		XMLDOC.Release();
	}
	::CoUninitialize();
	
	return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值