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. Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flas

    转自Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flash Player Chromium谷歌的开源浏览器将不再支持Netscape浏览器插件API,Adobe ...

  2. xapian安装

    xapian安装:$ su enter your root password # rpm -ivh http://rpm.eprints.org/rpm-eprints-org-key-1-1.noa ...

  3. [转贴]WebService的简单实现 C++

    WebService的简单实现 一.socket主机创建和使用过程 1.socket()//创建套接字 2.Setsockopt()//将套接字属性设置为允许和特定地点绑定 3.Bind()//将套接 ...

  4. 【CF】310 Div.1 C. Case of Chocolate

    线段树的简单题目,做一个离散化,O(lgn)可以找到id.RE了一晚上,额,后来找到了原因. /* 555C */ #include <iostream> #include <str ...

  5. 【HDOJ】2544 最短路

    Dijkstra. #include <stdio.h> #include <string.h> #define INF 0xfffffff ][]; ]; ]; int ma ...

  6. selenium webdriver(3)---操作页面对象

    页面对象的相关操作可以通过接口文件org.openqa.selenium.WebElement查看,本文只是对象接口的使用方式,具体的实现方式在org.openqa.selenium.remote.R ...

  7. HDOJ/HDU 1556 Color the ball(树状数组)

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3-.N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从 ...

  8. 安装windows系统(win7)

    又到了清理电脑,重装系统的时候了.最近被自己电脑折腾得不清,特记录下安装心得,以方便以后. 分区考虑(35G+40G) 35G=16G+4G+5G+10G,其中16G是64位官方旗舰版WIN7刚安装好 ...

  9. 【转】如何实现一个malloc

    任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉.但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至 ...

  10. CSDN被黑几年后 我决定继续blogs

    CSDN被黑几年后 我决定继续blogs 可惜了我那么多年的文章,全没了 希望这个博客顺风顺水---2015-12-23