上一篇博文我已经说明了服务端添加tinyxml的基本操作及基本用法。
我的服务端之添加xml解释器
http://blog.csdn.net/yitouhan/article/details/17453159
但是可以看出tinyxml读出的数据是不做类型匹配的,也就是说tinyxml读出的数据都是字符串。但是在实际应用中,我还需要其它的数据类型,例如整型和浮点型。
实现类型转换的关键在istringstream,下面的链接有介绍
http://baike.baidu.com/link?url=t0pOzUA1bmDBQaHlCN4D7LjvF7ow9xryeCbcX5IP0SxsGfwEjPyZcIU37goGRTt-ccs3pKU1g4OrMdXgaN6Woq
#ifndef COMMONCONFIG_H
#define COMMONCONFIG_H
#include <string>
#include <sstream>
// 将字符串转成基础数据类型,非基础类型需显示定义
template<class T>
bool StringToBaseType(const std::string& str, T& val)
{
std::istringstream stream;
stream.str(str);
if (stream>>val)
{
return true;
}
return false;
}
// 将基础数据类型转成字符串,非基础类型需显示定义
template<class T>
bool BaseTypeToString(const T& src, std::string& tar)
{
std::ostringstream stream;
if (stream<<src)
{
tar = stream.str();
return true;
}
return false;
}
#include "tinyxml/tinyxml.h"
template<class T>
static bool GetSubNodeValue(TiXmlElement *element, const std::string& name, T& val)
{
if (!element) return false;
TiXmlElement *TmpElement = element->FirstChildElement(name.c_str());
return GetNodeValue(TmpElement, val);
}
template<class T>
static bool SetSubNodeValue(TiXmlElement *element, const std::string& name, T& val)
{
if (!element) return false;
TiXmlElement *TmpElement = element->FirstChildElement(name.c_str());
return SetNodeValue(TmpElement, val);
}
// 读写如下节点element的值,不支持形如<element/>的空值
// <element>s_val</element>
template<class T>
static bool GetNodeValue(TiXmlElement *element, T& val)
{
if (!element || !element->FirstChild() || !StringToBaseType(element->GetText(), val))
{
return false;
}
return true;
}
class ConfigElementBase
{
public:
ConfigElementBase():m_element(0) {}
virtual ~ConfigElementBase() {}
void SetElement(TiXmlElement *element) { m_element = element; }
// 供子类列表中获取偏移地址
virtual ConfigElementBase* offset() = 0;
// 将子节点读到相应成员数据中
virtual bool read() = 0;
// 将成员数据写入文件
virtual bool write() = 0;
protected:
// 获取子节点的值,不适用有多个同名子节点的情况
template<class T>
bool GetValue(const char *name, T* value)
{
if (m_element == 0) return false;
return GetSubNodeValue(m_element, name, *value);
}
bool GetValue(const char *name, ConfigElementBase* value)
{
if (m_element == 0) return false;
value->SetElement(m_element->FirstChildElement(name));
return value->read();
}
// 获取子节点的值,适用有多个同名子节点的情况,与数组对应
template<class T>
bool GetListValue(const char *name, T* list_value, int& list_len, int list_max_len)
{
list_len = 0;
if (m_element == 0)
{
return false;
}
TiXmlElement *tmp_element = m_element->FirstChildElement(name);
for ( ;list_len < list_max_len && tmp_element != 0; ++list_len, ++list_value, tmp_element = tmp_element->NextSiblingElement(name))
{
if (!GetNodeValue(tmp_element, *list_value)) return false;
}
return true;
}
bool GetListValue(const char *name, ConfigElementBase* list_value, int& list_len, int list_max_len)
{
list_len = 0;
if (m_element == 0)
{
return false;
}
TiXmlElement *tmp_element = m_element->FirstChildElement(name);
for ( ;list_len < list_max_len && tmp_element != 0; ++list_len)
{
list_value->SetElement(tmp_element);
if (!list_value->read())return false;
list_value = list_value->offset();
tmp_element = tmp_element->NextSiblingElement(name);
}
return true;
}
// 设置子节点的值,不适用有多个同名子节点的情况
template<class T>
bool SetValue(const char *name, T* value)
{
if (m_element == 0) return false;
TiXmlElement * tmp_element = m_element->FirstChildElement(name);
if (!tmp_element)
{
TiXmlElement insert_node(name);
tmp_element = (TiXmlElement *)m_element->InsertEndChild(insert_node);
}
if (!tmp_element->FirstChild())
{
std::string tmp_value;
BaseTypeToString(*value, tmp_value);
TiXmlText sub_node(tmp_value);
tmp_element->InsertEndChild(sub_node);
return true;
}
return SetSubNodeValue(m_element, name, *value);
}
bool SetValue(const char *name, ConfigElementBase* value)
{
if (m_element == 0) return false;
TiXmlElement * tmp_element = m_element->FirstChildElement(name);
if (!tmp_element)
{
TiXmlElement insert_node(name);
m_element->InsertEndChild(insert_node);
tmp_element = m_element->FirstChildElement(name);
}
value->SetElement(tmp_element);
return value->write();
}
// 设置子节点的值,适用有多个同名子节点的情况,与数组对应
template<class T>
bool SetListValue(const char *name, T* list_value, int list_len)
{
if (m_element == 0 || list_len < 0)
{
return false;
}
TiXmlElement *tmp_element = m_element->FirstChildElement(name);
for(int i=0;i<list_len;++i,++list_value)
{
if (!tmp_element)
{
TiXmlElement insert_node(name);
tmp_element = (TiXmlElement *)m_element->InsertEndChild(insert_node);
}
if (!tmp_element->FirstChild())
{
std::string tmp_value;
BaseTypeToString(*list_value, tmp_value);
TiXmlText sub_node(tmp_value);
tmp_element->InsertEndChild(sub_node);
}
else
{
if (!SetNodeValue(tmp_element, *list_value)) return false;
}
tmp_element = tmp_element->NextSiblingElement(name);
}
while(tmp_element)
{
TiXmlElement *to_remove = tmp_element;
tmp_element = tmp_element->NextSiblingElement(name);
m_element->RemoveChild(to_remove);
};
return true;
}
bool SetListValue(const char *name, ConfigElementBase* list_value, int list_len)
{
if (m_element == 0 || list_len < 0)
{
return false;
}
TiXmlElement *tmp_element = m_element->FirstChildElement(name);
for(int i=0;i<list_len;++i)
{
if (!tmp_element)
{
TiXmlElement insert_node(name);
tmp_element = (TiXmlElement *)m_element->InsertEndChild(insert_node);
}
list_value->SetElement(tmp_element);
if (!list_value->write()) return false;
list_value= list_value->offset();
tmp_element = tmp_element->NextSiblingElement(name);
}
while(tmp_element)
{
TiXmlElement *to_remove = tmp_element;
tmp_element = tmp_element->NextSiblingElement(name);
m_element->RemoveChild(to_remove);
};
return true;
}
// 至少有一个节点的xml结构
TiXmlElement *m_element;
private:
};
#endif
下面是测试用例
<?xml version="1.0" encoding="utf-8"?>
<blog>
<blogger>一头汗</blogger>
<date>20131221</date>
<temperature>10.1</temperature>
</blog>
#include <stdio.h>
#include <time.h>
#include "globalvariable.h"
#include "luaengine.h"
#include "gamesocket.h"
#include "log.h"
#include "dll.h"
#include "MyDll.h"
#include "gametime.h"
#include "frame.h"
#include "datatable.h"
#include "showcrash.h"
#include "globalfunction.h"
#include "commonconfig.h"
void Init()
{
TiXmlDocument doc;
if (doc.LoadFile("conf/info.xml"))
{
TiXmlElement* rootElement = doc.RootElement();
if (rootElement == NULL)
{
return ;
}
char blogger[16]={0};
GetSubNodeValue(rootElement, "blogger",blogger);
printf("博主:%s\n", blogger);
int date = 0;
GetSubNodeValue(rootElement, "date",date);
printf("日期:%d\n", date);
float temperature = 0.0;
GetSubNodeValue(rootElement, "temperature", temperature);
printf("温度:%f\n", temperature);
}
}
int main()
{
Init();
return 0;
}
输出结果:
交流群:
315249378
分享到:
相关推荐
GetType 得到元素类型 GetChildren 得到所有的子元素 GetAttributeNames 得到所以的属性列表 GetAttribute 得到某个属性的值 GetText 得到文件值 GetName 得到元素名字 CFileWriter写XML文件的流程 CONode ...
密传搞定XML的工具,可以把XML转换成客户端TPA和服务端TPA
基础xslt与xml构建excel,使服务端execl告别简陋的csv格式文件,同时不用引用微软的offcice库。
android 转换服务端xml资源到本地类 eclipse工程文件,可直接导入运行
xml与java互相转换,比较简单的一个工具类,对xml的支持比较完美
VS2010 C#开发的webservice服务端,返回xml 文件,PowerBuilder 11.5调用webservice,得到XML文件到本地磁盘,然后转换为datawindow
这个小例子是使用Java作为服务端、Flex做前台,对一个xml文件的读取和写入。 环境:MyEclipse6.0.1+Flex3插件版,jdk1.6,tomcat6.0,dom4j1.6.1,lcds.war, 使用技术:1.Java+flex,及其对象的转换。 2.Java方面...
解压后有2个压缩包 Paging 是Flex做的客户端分页控件 PagingService是Java做的WebService服务端,用来模拟服务端返回数据。 服务端需要部署到类似tomcat这样的服务器中运行 ...它可以让Object---XML之间直接转换
×gSOAP 包含一个WSDL解析器(将WSDL转换为gSOAP头文件),可以自动化用户客户端及服务端的开发。 ×生成可以单独运行的web服务及客户端程序。 ×因为只需要很少内存空间,所以可以运行在类似Palm OS, Symbian...
一般情况下我们都会采用json格式或者xml格式,将服务端的数据转换成这两种格式之一。 但是,如果我们将数据转换成json格式的时候,我们也许会遇到Date日期型的数据转换成json格式后,并不是我们想要的格式。下面我们...
RequestMethod支持GET, POST, DELETE, PUT 参数获取支持 @FormParam, @PathParam, @QueryParam, @HeaderParam等 ...能够方便地实现Java复杂对象, List, Map对象与JSON/XML的互转换 支持多文件、多参数上传,支持文件下
在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样。 虽然大部分开发人员在过去使用过XMLHttp或者使用...
自己定义传输数据报文,报文中必须有xml数据。 例如:服务端提供用户注册,登录服务,字符串转换成大写功能。 1. 客户端发送注册信息到服务端,服务端返回成功或失败。 2. 客户端发送登录信息到服务端,服务端返回...
1.7数据类型转换 3 1.8实例方法,实例变量和静态方法,静态变量 4 1.9接口 Interface 4 1.10继承 Inheritance 5 2.ActionScript3.0常用类 6 2.1内容现实类 6 2.2 String 6 2.3 Array类 8 2.4 XML和E4X 9 2.5 事件处理 ...
第4天 01异常捕获 02练习 02异常捕获 03switch-case 04while循环 06练习 07while练习与do--while 08for 循环 12continue 09乘法口诀练习 10类型转换和方法转换 11tryparse练习 13三元表达式 第5天 00随机数 05数组 ...
本文档中有完整的服务端和客户端,cxf和spring集成在一起, 从pom.xml依赖包,到web.xml配置,然后spring的配置文件,再到接口,实现类,类型转换,完成的实例,由于公司业务需求花了两天完成
IValueConverter - 值转换接口,将一个类型的值转换为另一个类型的值。它提供了一种将自定义逻辑应用于绑定的方式 BindingValidationError - 出现验证错误或解决上次验证错误则触发此事件 14、Silverlight(16) - 2.0...
LanHelper能扫描到远程计算机非常丰富的各种信息,包括了名称(NetBIOS名或者DNS名)、IP地址、MAC地址、工作组...当使用浏览器打开XML文件时,使用XSL编写的样式表文件LHstyle.xsl会将其转换为网页表格,非常便于查看。
在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样。 Ajax的核心是JavaScript对象XmlHttpRequest。该...
4.4.3.自定义类型转换器 4.4.3.1.使用CustomConverterConfigurer类 4.5.自定义对象的行为 4.5.生命周期接口 4.5.1.1.IInitializingObject接口和init-method属性 4.5.1.2.IDisposable接口和destroy-method属性 4.5.2....