递归获取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;
}