`
20386053
  • 浏览: 433232 次
文章分类
社区版块
存档分类
最新评论

我的服务端之xml类型转换

 
阅读更多
上一篇博文我已经说明了服务端添加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

分享到:
评论

相关推荐

    我叫MT3bin转XML

    GetType 得到元素类型 GetChildren 得到所有的子元素 GetAttributeNames 得到所以的属性列表 GetAttribute 得到某个属性的值 GetText 得到文件值 GetName 得到元素名字 CFileWriter写XML文件的流程 CONode ...

    密传xml转TPA工具

    密传搞定XML的工具,可以把XML转换成客户端TPA和服务端TPA

    使用XSLT和XML创建Excel

    基础xslt与xml构建excel,使服务端execl告别简陋的csv格式文件,同时不用引用微软的offcice库。

    parse xml string from url to POJO

    android 转换服务端xml资源到本地类 eclipse工程文件,可直接导入运行

    xstream服务端

    xml与java互相转换,比较简单的一个工具类,对xml的支持比较完美

    C#创建WEBSERVICE、PB调用实例

    VS2010 C#开发的webservice服务端,返回xml 文件,PowerBuilder 11.5调用webservice,得到XML文件到本地磁盘,然后转换为datawindow

    Java+flex使用dom4j读写xml

    这个小例子是使用Java作为服务端、Flex做前台,对一个xml文件的读取和写入。 环境:MyEclipse6.0.1+Flex3插件版,jdk1.6,tomcat6.0,dom4j1.6.1,lcds.war, 使用技术:1.Java+flex,及其对象的转换。 2.Java方面...

    FlexPagingBar Flex分页控件

    解压后有2个压缩包 Paging 是Flex做的客户端分页控件 PagingService是Java做的WebService服务端,用来模拟服务端返回数据。 服务端需要部署到类似tomcat这样的服务器中运行 ...它可以让Object---XML之间直接转换

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

     ×gSOAP 包含一个WSDL解析器(将WSDL转换为gSOAP头文件),可以自动化用户客户端及服务端的开发。  ×生成可以单独运行的web服务及客户端程序。  ×因为只需要很少内存空间,所以可以运行在类似Palm OS, Symbian...

    后台日期类型转json字符串传到页面

    一般情况下我们都会采用json格式或者xml格式,将服务端的数据转换成这两种格式之一。 但是,如果我们将数据转换成json格式的时候,我们也许会遇到Date日期型的数据转换成json格式后,并不是我们想要的格式。下面我们...

    超轻量RESTful框架—SlwRest(Super Lightweight)客户端及服务端Demo代码

    RequestMethod支持GET, POST, DELETE, PUT 参数获取支持 @FormParam, @PathParam, @QueryParam, @HeaderParam等 ...能够方便地实现Java复杂对象, List, Map对象与JSON/XML的互转换 支持多文件、多参数上传,支持文件下

    Ajax实用技巧完全指南

    在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样。 虽然大部分开发人员在过去使用过XMLHttp或者使用...

    实现请求回答网络通讯

    自己定义传输数据报文,报文中必须有xml数据。 例如:服务端提供用户注册,登录服务,字符串转换成大写功能。 1. 客户端发送注册信息到服务端,服务端返回成功或失败。 2. 客户端发送登录信息到服务端,服务端返回...

    Flex新手教程_入门级学习笔记

    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 事件处理 ...

    C#入门——面向对象等,代码+注释

    第4天 01异常捕获 02练习 02异常捕获 03switch-case 04while循环 06练习 07while练习与do--while 08for 循环 12continue 09乘法口诀练习 10类型转换和方法转换 11tryparse练习 13三元表达式 第5天 00随机数 05数组 ...

    webServer CXF

    本文档中有完整的服务端和客户端,cxf和spring集成在一起, 从pom.xml依赖包,到web.xml配置,然后spring的配置文件,再到接口,实现类,类型转换,完成的实例,由于公司业务需求花了两天完成

    Silverlight2.0功能展示Demo源码

    IValueConverter - 值转换接口,将一个类型的值转换为另一个类型的值。它提供了一种将自定义逻辑应用于绑定的方式 BindingValidationError - 出现验证错误或解决上次验证错误则触发此事件 14、Silverlight(16) - 2.0...

    LanHelper(中文名称“局域网助手”)是Windows平台上强大的局域网管理、扫描、监视工具。

    LanHelper能扫描到远程计算机非常丰富的各种信息,包括了名称(NetBIOS名或者DNS名)、IP地址、MAC地址、工作组...当使用浏览器打开XML文件时,使用XSL编写的样式表文件LHstyle.xsl会将其转换为网页表格,非常便于查看。

    ajax文档ajax文档

    在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样。  Ajax的核心是JavaScript对象XmlHttpRequest。该...

    spring.net中文手册在线版

    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....

Global site tag (gtag.js) - Google Analytics