C++读取xml有很多第三方的xml解析库,最近使用tinyxml库来解析,下面直接上应用例子:
Skin.xml文档内容如下:
<UI> <Image name="banner" x="0" y= "0" width="900" height="40" img_src="imguianner.jpg" /> <Image name="logo" x="5" y= "5" width="32" height="32" img_src="imguilogo.png" /> <Image name="logo" x="863" y= "5" width="32" height="32" img_src="imguiclose.png" /> <Button id="1001" x="540" y= "360" width="48" height="48" img_normal="imguitn_start_normal.png" img_hover="imguitn_start_hover.png" img_down="imguitn_start_normal.png" /> <Button id="1002" x="540" y= "480" width="48" height="48" img_normal="imguitn_stop_normal.png" img_hover="imguitn_stop_hover.png" img_down="imguitn_stop_normal.png" /> <Button id="1003" x="250" y= "5" width="48" height="48" img_normal="imguitn_pre_normal.png" img_hover="imguitn_pre_hover.png" img_down="imguitn_pre_normal.png" /> <Button id="1004" x="250" y= "845" width="48" height="48" img_normal="imguitn_next_normal.png" img_hover="imguitn_next_hover.png" img_down="imguitn_next_normal.png" /> </UI>
C++利用tinyxml库读取的关键代码如下:(这里得先说明下,下面代码中的MyButton类是我自己自定义的button类,实现原理和代码在我的另一篇文章:http://www.cnblogs.com/JczmDeveloper/p/3494615.html):
#include "tinyxml/tinyxml.h" void LoadSkin(LPCTSTR lpszRelativePath,LPCTSTR lpszXmlName) { CString strCurDir = Util::GetCurrentDir();//获取当前目录 CString strRelativePath = lpszRelativePath; CString strXmlName = lpszXmlName; strCurDir += strRelativePath; CString strXmlPath = strCurDir + L"\"+ strXmlName; USES_CONVERSION; LPCSTR lpStr =NULL; lpStr = T2A(strXmlPath.GetBuffer(strXmlPath.GetLength())); //加载xml文件 TiXmlDocument* pDoc = new TiXmlDocument(lpStr); bool bLoadOk = pDoc->LoadFile(); //读取xml文件 CString strX ,strY,strWidth,strHeight,strImgSrc; int nX =0,nY=0,nWidth=0,nHeight=0; int nID = 0; CString strID,strBtnNormal,strBtnHover,strBtnDown; CString strElementType; CString strAttrName = L""; TiXmlElement* pRootElement = pDoc->RootElement(); TiXmlElement* pElement = pRootElement->FirstChildElement(); while(pElement) { strElementType = pElement->Value(); if(strElementType == L"Button") { //读取当前元素节点 TiXmlAttribute* pAttribute = pElement->FirstAttribute(); while(pAttribute) { strAttrName = pAttribute->Name(); if(strAttrName ==L"id") strID = pAttribute->Value(); else if(strAttrName == L"x") strX =pAttribute->Value(); else if(strAttrName == L"y") strY = pAttribute->Value(); else if(strAttrName == L"width") strWidth = pAttribute->Value(); else if(strAttrName == L"height") strHeight = pAttribute->Value(); else if(strAttrName == L"img_normal") strBtnNormal = pAttribute->Value(); else if(strAttrName == L"img_hover") strBtnHover = pAttribute->Value(); else if(strAttrName == L"img_down") strBtnDown = pAttribute->Value(); pAttribute = pAttribute->Next(); } nID = _ttoi(strID); nX = _ttoi(strX); nY = _ttoi(strY); nWidth = _ttoi(strWidth); nHeight = _ttoi(strHeight); CString szDir = Util::GetCurrentDir(); strBtnNormal = szDir + strBtnNormal; strBtnHover = szDir + strBtnHover; strBtnDown = szDir + strBtnDown; CRect rt; rt.top = nX; rt.left = nY; rt.right = rt.left + nWidth; rt.bottom = rt.top + nHeight; MyButton* pButton = new MyButton; pButton->SetBtnBmp(strBtnNormal,strBtnHover,strBtnDown); pButton->Create(m_hWnd,rt,NULL,WS_CHILD|WS_VISIBLE); pButton->SetBtnID(nID); } else if(strElementType == L"Image") { //读取当前元素节点 TiXmlAttribute* pAttribute = pElement->FirstAttribute(); while(pAttribute) { strAttrName = pAttribute->Name(); if(strAttrName == L"x") strX =pAttribute->Value(); else if(strAttrName == L"y") strY = pAttribute->Value(); else if(strAttrName == L"width") strWidth = pAttribute->Value(); else if(strAttrName == L"height") strHeight = pAttribute->Value(); else if(strAttrName == L"img_src") strImgSrc = pAttribute->Value(); pAttribute = pAttribute->Next(); } nX = _ttoi(strX); nY = _ttoi(strY); nWidth = _ttoi(strWidth); nHeight = _ttoi(strHeight); CString szDir = Util::GetCurrentDir(); CString strImgPath = szDir + strImgSrc; Graphics graphics(GetWindowDC()); Image img(strImgPath,FALSE); graphics.DrawImage(&img,nX,nY,nWidth,nHeight); } //下一个元素节点 pElement = pElement->NextSiblingElement(); } }