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

我的服务端之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

分享到:
评论

相关推荐

    xml和bean 互相转换

    在Java开发中,XML(可扩展标记语言)和Bean之间的互相转换是一项常见的任务,尤其是在处理配置文件、数据交换或者序列化场景中。本篇将详细阐述XML与Bean之间的转换过程,以及相关的Java技术。 首先,XML是一种...

    我叫MT3bin转XML

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

    Android高级应用源码-Android解析服务端XML.zip

    【Android高级应用源码-Android解析服务端XML.zip】是一个包含Android高级开发示例的压缩包,主要聚焦于如何在Android应用中解析来自服务端的XML数据。Android平台广泛使用XML来传输和处理结构化的数据,例如新闻、...

    Android代码-Android解析服务端XML.zip

    本主题聚焦于"Android解析服务端XML",这涉及到Android应用如何接收并处理XML数据,以展示或者用于应用程序的逻辑。XML(可扩展标记语言)是一种结构化数据格式,常用于Web服务的数据传输。 首先,Android提供了...

    server_xml_json

    "Server_xml_json"是一个关于XML和JSON在服务端解析的主题,主要关注如何在服务器环境中将XML数据转换为JSON格式,或者反之。XML(eXtensible Markup Language)是一种标记语言,常用于数据交换和存储,而JSON...

    webservice接口接收xml,string代码

    本篇文章将根据提供的代码示例,详细介绍如何通过WebService接口接收XML格式的数据以及字符串类型的数据,并对相关知识点进行深入剖析。 #### 二、接收XML数据 首先,我们来看一下如何通过WebService接口接收XML...

    delphi客户端连接JAVA服务端

    这个组件提供了一种直观的方式来构建XML树,并且可以方便地将数据转换为XML格式。 2. 发送请求:使用HTTP或者HTTPS协议,通过 Indy 或 WinINet 库发送HTTP请求到Java服务端。请求中携带用XML格式封装的数据。 3. ...

    XmlSchema-1.4.7.jar

    总结起来,XmlSchema-1.4.7.jar是用于处理XML Schema的Java库,它提供了XML文档验证、类型转换等功能,并可能在Web服务框架中得到应用。了解并熟练使用这个库,对于Java开发者来说,能够提高他们在处理XML数据时的...

    gsoap c++服务端程序

    `soapcpp2`是一个预处理器,它将WSDL(Web服务描述语言)或者接口头文件转换为C++代码,生成服务端和客户端的接口。运行时库则提供了执行SOAP消息交换的必要功能。 2. **C++与gSOAP结合**: 在C++项目中,首先需要...

    delphi客户端+JAVA服务端

    3. 数据序列化与反序列化:如JSON对象在客户端和服务端间的转换。 4. 错误处理和异常机制:客户端和服务端如何优雅地处理错误并提供反馈。 五、应用场景与优化 此类系统广泛应用于企业级应用,如ERP、CRM系统,以及...

    gsoap服务端 c++实现

    SOAP是一种基于XML的协议,常用于分布式计算,允许应用程序通过网络交换结构化和类型化的信息。 在C++中实现gSOAP服务端涉及以下几个关键知识点: 1. **gSOAP工具生成代码**:gSOAP提供了一套编译器工具,可以自动...

    一个源代码学习服务端 ,基于mina

    5. **数据操作**:学习如何在服务端对读取到的CSV和XML数据进行处理,例如查询、过滤、转换等,这可能涉及到Java集合类、Stream API或XPath表达式。 6. **并发编程**:由于服务端可能同时处理多个连接,了解Java多...

    服务端.rar

    在IT领域,网络编程是构建分布式系统和互联网应用的基础,而Socket编程是网络通信的核心技术之一。本资源“服务端.rar”提供了一个基于Socket的通用服务端网络模块,旨在帮助初学者理解并实践网络服务器的开发。下面...

    tinyXML Json接口实现

    项目中的"tinytest111"可能是一个测试程序,用于验证XML到JSON和JSON到XML转换的正确性。测试代码通常会包含各种XML和JSON样例,检查转换过程是否保持了数据的一致性,包括标签、属性、文本节点以及嵌套结构等。 在...

    C# 写的一个XML与Json互转类

    XML(Extensible Markup Language)和Json(JavaScript Object Notation)是两种常见的数据交换格式,广泛应用于客户端和服务端之间的通信。XML提供了丰富的结构化表示,而Json因其简洁轻量级的特性在现代API中更受...

    Java版-客户端与服务端

    4. **Spring框架**:Spring是Java开发中最流行的服务端框架之一,提供了Model-View-Controller(MVC)架构,简化了客户端与服务端的交互。Spring MVC模块支持RESTful Web服务,便于创建高效、可测试的API。 5. **...

    axis1.4服务端

    这些文件可以帮助我们理解服务端的实现细节,以及客户端如何与之通信。通过分析这些文件,我们可以学习到如何在实际项目中应用Axis1.4来构建和使用Web服务。 总的来说,Axis1.4服务端的编写涉及Web服务的基础概念,...

    dxServlet.java处理Http Post的表单请求xml

    为了处理 POST 请求中的 XML 数据,`dxServlet.java` 使用了 SAX(Simple API for XML)解析器。SAX 是一种基于事件驱动的 XML 解析方式,非常适合大型文档的解析。它不一次性加载整个 XML 文档到内存中,而是随着...

    Beginning XML with C# 7 XML Processing and Data Access for C# Developers

    此外,XML Schema(XSD)和XML DTD(文档类型定义)也会被介绍,它们用于定义XML文档的结构和验证规则。 随着.NET框架的更新,本书还会涵盖WCF(Windows Communication Foundation)和Web API,它们是构建基于XML的...

    利用XMLBean轻轻松松读写XML

    XMLBean通过XSD(XML Schema Definition)文件将XML结构转换为Java类。这些Java类可以直接用来创建、访问和修改XML文档,就像操作普通Java对象一样。这样,开发者可以避免直接处理复杂的DOM或SAX解析,提高了代码的...

Global site tag (gtag.js) - Google Analytics