C++ 读取XML文件(tinyXML库的应用)
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库的应用)的更多相关文章
- C语言处理xml文件的库
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- Android 开发自己的网络收音机4——读取XML文件的电台数据
国内外的电台数据很多,起码有好几百,所以把这些数据都写到代码里面是不实际的.只能写成一个数据文件,程序启动的时候再去加载.保存这些简单数据,我们肯定会优先使用XML文件,今天讲讲如何读取XML里面的数 ...
- C#读取XML文件的方法
先写一个xml文件: <?xml version="1.0" encoding="utf-8" ?> <bookste> <!-- ...
- DOM4J读取XML文件
最近在做DRP的项目,其中涉及到了读取配置文件,用到了DOM4J,由于是刚开始接触这种读取xml文件的技术,好奇心是难免的,于是在网上又找了一些资料,这里就结合找到的资料来谈一下读取xml文件的4中方 ...
- 读取xml文件,写入excel
在上一篇 Python写xml文件已经将所有订单写入xml文件,这一篇我们把xml文件中的内容读出来,写入excel文件. 输入xml格式: <?xml version="1.0&qu ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- C#中常用的几种读取XML文件的方法
1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/
- 读取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- ...
- C#读取XML文件的基类实现
刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...
随机推荐
- ZOJ 2562 More Divisors
又是个水题,刚刚开始没有用搜索,因为对于反素数有: n=2^t1*3^t2^5^t3*7^t4..... 这里有 t1>=t2>=t3>=t4. 而且相同的因数的情况下,素数越不同越 ...
- ubuntu 64bit “arm-linux-gcc: No such file or directory”问题的解决方法
安装lsb-core sudo apt-get install lsb-core
- 【Xamarin开发 Android 系列 7】 Android 结构基础(下)
原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...
- 【HDOJ】2157 How many ways??
矩阵乘法,用DP做各种wa,后来发现原因了. #include <stdio.h> #include <string.h> typedef struct { ][]; } ma ...
- menuconfig选项
打开一个典型的openwrt中package目录下都能发现两个相同点: ? package/<name> /Makefile ? package/<name> /patches ...
- WC2015 滚粗记
Day 0 和南师附中诸人去杭州,想到这是第三次去杭州有点感动 想到noi还要在杭州,简直…… 火车站接送好评如潮 ym大学军,到学军领资料然后到浙大宿舍安顿,noi的书包还是挺不错的 看起来宿舍还可 ...
- bzoj3876
不高兴的回忆啊啊啊当初这种简单题因为自己作死就暴零0了这题在OJ上是简单的最小有下界费用流,增广到正费用为止因为算的是总时限但实际的话似乎要用pacman吃豆豆那题的方法先用dp跑出第一次的增广路再用 ...
- efront二次开发记要
efront系统是一套开源的在线学习系统,是用PHP编写的,内含“考试”功能.该系统的开源的是社区版,虽然看上去功能强大,但使用起来却很不符合国情.为了让公司使用,先做了一次最简化的二次开发,由于是最 ...
- Oracle坑之-空字符串与NULL
空字符串与NULL 首先有如下代码 SELECT * FROM Pdc_DataDomain DD INNER JOIN Pdc_DD_Table DDT ON DD.DataDomainID = D ...
- v8 javascript engine
https://code.google.com/p/v8-wiki/wiki/BuildingWithGYP vs2013git v8 http://github.com/v8/v8-git-mirr ...