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. 关于ARP欺骗与MITM(中间人攻击)的一些笔记( 二 )

    一直没有折腾啥东西,直到最近kali Linux发布,才回想起应该更新博客了….. 再次说明,这些技术并不是本人原创的,而是以前记录在Evernote的旧内容(排版不是很好,请谅解),本文是继关于AR ...

  2. PHP传引用报错(5.4版本)

    php5.3系列版本以及以前版本,传引用没有什么问题,升级到php5.4以后,传引用的地方,全报错 Fatal error: Call-time pass-by-reference has been ...

  3. 【Earthquake, 2001 Open 】 0-1 分数规划

    71  奶牛施工队一场地震把约翰家园摧毁了,坚强的约翰决心重建家园.约翰已经修复了 N 个牧场,他需要再修复一些道路把它们连接起来.碰巧的是,奶牛们最近也成立了一个工程队,专门从事道路修复.而然,奶牛 ...

  4. C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用

    我也遇到同样问题,所以抄下做MARK http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html 刚做完一个binding为netTcpBi ...

  5. python3使用requests爬取新浪热门微博

    微博登录的实现代码来源:https://gist.github.com/mrluanma/3621775 相关环境 使用的python3.4,发现配置好环境后可以直接使用pip easy_instal ...

  6. 关于v$sql_bind_capture 的问题

    ---先清空shared_pool SQL> alter system flush shared_pool; System altered. SQL> col value_STRING f ...

  7. ListView 的position和id的区别

    我们在使用ListView的时候,一般都会为ListView添加一个响应事件android.widget.AdapterView.OnItemClickListener.本文主要在于对OnItemCl ...

  8. 【Moment.js】

    Moment.js Moment.js中文网 var moment = require('moment') moment.locale('zh-cn') /* 九月 13日 2015, 4:45:25 ...

  9. 在Code First中使用Migrations对实体类和数据库做出变更

    在Code First中使用Migrations对实体类和数据库做出变更,Mirgration包含一系列命令. 工具--库程序包管理器--程序包管理器控制台 运行命令:Enable-Migration ...

  10. SQL Server数据库修改字段属性

      1:向表中添加字段 Alter table [表名] add [列名] 类型 2: 删除字段 Alter table [表名] drop column [列名] 3: 修改表中字段类型 (可以修改 ...