📄 cxml.cpp
字号:
#include "stdafx.h"
#include "CXML.h"
CXML::CXML(void)
{
}
CXML::~CXML(void)
{
}
//加载XML文件(文件名)
BOOL CXML::LoadXML(char* XmlFile)
{
IXMLDOMDocument* pDoc; //DOM解析对象
if(SUCCEEDED(CoInitialize(NULL)))
{
//是否成功创建XML-----DOM对象
if(SUCCEEDED(CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument, (void**)&pDoc)))
{
VARIANT_BOOL vBool;
if(SUCCEEDED(pDoc->put_async(VARIANT_FALSE)))
{
CComVariant vFile(XmlFile);
pDoc->load(vFile,&vBool); //加载
if(vBool==VARIANT_TRUE)
{
if(ReadXML(pDoc)) //读取
{
pDoc->Release();
pDoc=NULL;
return TRUE;
}
else
{
pDoc->Release();
pDoc=NULL;
return FALSE;
}
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
return TRUE;
}
//----------------------------读取XML-----------------------------------
BOOL CXML::ReadXML(IXMLDOMDocument* pDoc)
{
BOOL result;
IXMLDOMNode* pNode;
if(SUCCEEDED(pDoc->QueryInterface(IID_IXMLDOMNode,(void**)(&pNode))))
{
result = IterateChildNote(pNode);
}
pNode->Release();
pNode=NULL;
return result;
}
BOOL CXML::IterateChildNote(IXMLDOMNode* pNode)
{
USES_CONVERSION;
BSTR bstrNodeName; //节点名字
BSTR bstrNodeType; //节点类型名字
BSTR bstrValue; //节点值
DOMNodeType eEnum; //节点类型
ResStruct* res; //XML映射结构
SortMenu* sortmenu; //类型结构
//--------------------------------------------
char* cNodeName; //char*类型的节点名字
//--------------------------------------------
if(pNode)
{
pNode->get_nodeName(&bstrNodeName); //得到节点名字
pNode->get_nodeTypeString(&bstrNodeType); //得到节点类型名字
pNode->get_nodeType(&eEnum); //得到节点类型
pNode->get_text(&bstrValue); //得到节点值
cNodeName = OLE2T(bstrNodeName);
if(eEnum == NODE_ELEMENT)
{
//如果读到另一种资源
/*if(strcmp(cNodeName,"RES") == 0)
{
sortmenu = new SortMenu;
IterateAttibutes(pNode,sortmenu);
}
else */if(strcmp(cNodeName,"IMG") == 0)
{
res = new ResStruct;
IterateAttibutes(pNode,res);
}
}
}
//------------------------递归-----------------------------
IXMLDOMNode* pNext=NULL;
IXMLDOMNode* pChild;
pNode->get_firstChild(&pChild);
while(pChild)
{
IterateChildNote(pChild);
pChild->get_nextSibling(&pNext);
pChild->Release();
pChild=pNext;
}
return TRUE;
}
BOOL CXML::IterateAttibutes(IXMLDOMNode* pNode,ResStruct* res)
{
IXMLDOMNamedNodeMap* pAttrs;
char* cName;
char* cValue;
USES_CONVERSION;
if(SUCCEEDED(pNode->get_attributes(&pAttrs))&&(pAttrs!=NULL))
{
IXMLDOMNode* pChild;
pAttrs->nextNode(&pChild);
int R,G,B; //颜色RGB
while(pChild)
{
BSTR bstrName;
VARIANT vValue;
pChild->get_nodeName(&bstrName);
pChild->get_nodeValue(&vValue);
cName = OLE2T(bstrName);
if(strcmp(cName,"RESID")==0)
{
cValue = OLE2T(vValue.bstrVal);
res->ResId = atoi(cValue); //资源ID
res->TypeId = this->iResTypeId; //类别ID
}
else if (strcmp(cName,"src")==0) {
cValue = OLE2T(vValue.bstrVal);
strcpy(res->ResSrc,cValue); //资源地址
}
else if(strcmp(cName,"width")==0)
{
cValue = OLE2T(vValue.bstrVal);
res->width = atoi(cValue); //宽
}
else if(strcmp(cName,"height")==0)
{
cValue = OLE2T(vValue.bstrVal);
res->height = atoi(cValue); //宽
}
else if(strcmp(cName,"R")==0)
{
cValue = OLE2T(vValue.bstrVal);
R = atoi(cValue); //R
}
else if(strcmp(cName,"G")==0)
{
cValue = OLE2T(vValue.bstrVal);
G = atoi(cValue); //G
}
else if(strcmp(cName,"B")==0)
{
cValue = OLE2T(vValue.bstrVal);
B = atoi(cValue);
res->KeyColor = RGB(R,G,B); //B
ResVector.push_back(res); //添加到资源
}
SysFreeString(bstrName);
VariantClear(&vValue);
pChild->Release();
pAttrs->nextNode(&pChild);
}
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -