C++读取xml有很多第三方的xml解析库,最近使用tinyxml库来解析,下面直接上应用例子:

Skin.xml文档内容如下:

<UI>
<Image name="banner" x="0" y= "0" width="900" height="40" img_src="\img\ui\banner.jpg" />
<Image name="logo" x="5" y= "5" width="32" height="32" img_src="\img\ui\logo.png" />
<Image name="logo" x="863" y= "5" width="32" height="32" img_src="\img\ui\close.png" />
<Button id="1001" x="540" y= "360" width="48" height="48" img_normal="\img\ui\btn_start_normal.png" img_hover="\img\ui\btn_start_hover.png" img_down="\img\ui\btn_start_normal.png" />
<Button id="1002" x="540" y= "480" width="48" height="48" img_normal="\img\ui\btn_stop_normal.png" img_hover="\img\ui\btn_stop_hover.png" img_down="\img\ui\btn_stop_normal.png" />
<Button id="1003" x="250" y= "5" width="48" height="48" img_normal="\img\ui\btn_pre_normal.png" img_hover="\img\ui\btn_pre_hover.png" img_down="\img\ui\btn_pre_normal.png" />
<Button id="1004" x="250" y= "845" width="48" height="48" img_normal="\img\ui\btn_next_normal.png" img_hover="\img\ui\btn_next_hover.png" img_down="\img\ui\btn_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();
} }

  

C++ 读取XML文件(tinyXML库的应用)的更多相关文章

  1. C语言处理xml文件的库

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...

  2. Android 开发自己的网络收音机4——读取XML文件的电台数据

    国内外的电台数据很多,起码有好几百,所以把这些数据都写到代码里面是不实际的.只能写成一个数据文件,程序启动的时候再去加载.保存这些简单数据,我们肯定会优先使用XML文件,今天讲讲如何读取XML里面的数 ...

  3. C#读取XML文件的方法

    先写一个xml文件: <?xml version="1.0" encoding="utf-8" ?> <bookste> <!-- ...

  4. DOM4J读取XML文件

    最近在做DRP的项目,其中涉及到了读取配置文件,用到了DOM4J,由于是刚开始接触这种读取xml文件的技术,好奇心是难免的,于是在网上又找了一些资料,这里就结合找到的资料来谈一下读取xml文件的4中方 ...

  5. 读取xml文件,写入excel

    在上一篇 Python写xml文件已经将所有订单写入xml文件,这一篇我们把xml文件中的内容读出来,写入excel文件. 输入xml格式: <?xml version="1.0&qu ...

  6. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  7. C#中常用的几种读取XML文件的方法

    1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/

  8. 读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。

    程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2- ...

  9. C#读取XML文件的基类实现

    刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...

随机推荐

  1. Cloud Insight 客户案例-晨芯时代科技有限公司

    在不断迭代的过程中,Cloud Insight 也很重视客户对产品的使用体验,这次我们拜访了晨芯时代,了解到他们在使用 Cloud Insight 过程中对产品的一些想法. 客户背景 晨芯时代是一家开 ...

  2. Android njava.net.UnknownHostException: Unable to resolve host

    我在android开发的时候经常会遇到这个错误,一般来说,造成这种错误的最普遍情况有两种:  1.android设备网络连接没打开,例如3G网络和WIFI网络 所以,如果遇到这种错误时,请先查看网络是 ...

  3. Freemarker 对null值报错的处理

    忽略null值 假设前提:user.name为null ${user.name},异常 ${user.name!},显示空白 ${user.name!'vakin'},若user.name不为空则显示 ...

  4. 【HDU 2853】Assignment (KM)

    Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...

  5. easyui的datagrid组件,如何设置点击某行不会高亮该行的方式

    easyui的datagrid组件,有些时候我们点击某行不想高亮显示,如何设置点击某行不会高亮该行的方式,有好几种方法可以实现,我举几个,可以根据你具体需求灵活应用: 1.修改easyui的css将高 ...

  6. 没做过编译器就是被人欺——从一道变态的i++题猜编译器的行为(表达式从左往右扫描,同一变量相互影响)

    首先不要被人蒙了,如果是这样,根本编译不过: int i=1; int b=i+++++i; printf("%d %d\n", b ,i); Mingw报错:error: lva ...

  7. 剖析Qt的事件机制原理

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...

  8. Android4.0以下View的Drag和Drop简单实现

    主要代码部分: 实现View的onTouch方法,变换落点的X,Y坐标,定义两个变量存放拖动前的坐标位置. int prevX,prevY; @Override public boolean onTo ...

  9. CCS3.3之DM642开发环境建立

    使用的仿真器是SEED-XDSUSB2.0/5V. 之前用的是CCS2.2,换成了CCS3.3的. 1.安装CCS3.3.38.在我安装完后,并没有急着升级,升级的程序是SR12_CCS_v3.3_S ...

  10. SFTP文件上传与下载

    SFTP是对ftp进行加密的一种文件协议. 首先是先引入:jsch-0.1.42-sources.jar与jsch-0.1.42.jar包 SFTP文件上传与下载. import java.io.Fi ...