zoukankan      html  css  js  c++  java
  • C++ 读取XML文件(tinyXML库的应用)

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

      

  • 相关阅读:
    标志寄存器和跳转指令
    js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版【转】
    关于mysql的级联删除(之前好多人咨询过我)
    用DIV画个漂亮的Table,根本看不出是div画的
    最简单的Ajax局部提交整体form,无刷新页面
    themeleaf中使用javascript时,字符“&&”的转义问题。
    Mysql 进行sequence的新建,同时建立计划每日重置。
    动态给H5页面绑定数据,基本万能无错误!
    手风琴效果简单实现,修改bootstrap内部事件接口并且自由定义。
    JQuery实现追加表格,不使用拼接html方式
  • 原文地址:https://www.cnblogs.com/JczmDeveloper/p/3494640.html
Copyright © 2011-2022 走看看