上一篇博文我已经说明了服务端添加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
分享到:
相关推荐
在Java开发中,XML(可扩展标记语言)和Bean之间的互相转换是一项常见的任务,尤其是在处理配置文件、数据交换或者序列化场景中。本篇将详细阐述XML与Bean之间的转换过程,以及相关的Java技术。 首先,XML是一种...
GetType 得到元素类型 GetChildren 得到所有的子元素 GetAttributeNames 得到所以的属性列表 GetAttribute 得到某个属性的值 GetText 得到文件值 GetName 得到元素名字 CFileWriter写XML文件的流程 CONode ...
【Android高级应用源码-Android解析服务端XML.zip】是一个包含Android高级开发示例的压缩包,主要聚焦于如何在Android应用中解析来自服务端的XML数据。Android平台广泛使用XML来传输和处理结构化的数据,例如新闻、...
本主题聚焦于"Android解析服务端XML",这涉及到Android应用如何接收并处理XML数据,以展示或者用于应用程序的逻辑。XML(可扩展标记语言)是一种结构化数据格式,常用于Web服务的数据传输。 首先,Android提供了...
"Server_xml_json"是一个关于XML和JSON在服务端解析的主题,主要关注如何在服务器环境中将XML数据转换为JSON格式,或者反之。XML(eXtensible Markup Language)是一种标记语言,常用于数据交换和存储,而JSON...
本篇文章将根据提供的代码示例,详细介绍如何通过WebService接口接收XML格式的数据以及字符串类型的数据,并对相关知识点进行深入剖析。 #### 二、接收XML数据 首先,我们来看一下如何通过WebService接口接收XML...
这个组件提供了一种直观的方式来构建XML树,并且可以方便地将数据转换为XML格式。 2. 发送请求:使用HTTP或者HTTPS协议,通过 Indy 或 WinINet 库发送HTTP请求到Java服务端。请求中携带用XML格式封装的数据。 3. ...
总结起来,XmlSchema-1.4.7.jar是用于处理XML Schema的Java库,它提供了XML文档验证、类型转换等功能,并可能在Web服务框架中得到应用。了解并熟练使用这个库,对于Java开发者来说,能够提高他们在处理XML数据时的...
`soapcpp2`是一个预处理器,它将WSDL(Web服务描述语言)或者接口头文件转换为C++代码,生成服务端和客户端的接口。运行时库则提供了执行SOAP消息交换的必要功能。 2. **C++与gSOAP结合**: 在C++项目中,首先需要...
3. 数据序列化与反序列化:如JSON对象在客户端和服务端间的转换。 4. 错误处理和异常机制:客户端和服务端如何优雅地处理错误并提供反馈。 五、应用场景与优化 此类系统广泛应用于企业级应用,如ERP、CRM系统,以及...
SOAP是一种基于XML的协议,常用于分布式计算,允许应用程序通过网络交换结构化和类型化的信息。 在C++中实现gSOAP服务端涉及以下几个关键知识点: 1. **gSOAP工具生成代码**:gSOAP提供了一套编译器工具,可以自动...
5. **数据操作**:学习如何在服务端对读取到的CSV和XML数据进行处理,例如查询、过滤、转换等,这可能涉及到Java集合类、Stream API或XPath表达式。 6. **并发编程**:由于服务端可能同时处理多个连接,了解Java多...
在IT领域,网络编程是构建分布式系统和互联网应用的基础,而Socket编程是网络通信的核心技术之一。本资源“服务端.rar”提供了一个基于Socket的通用服务端网络模块,旨在帮助初学者理解并实践网络服务器的开发。下面...
项目中的"tinytest111"可能是一个测试程序,用于验证XML到JSON和JSON到XML转换的正确性。测试代码通常会包含各种XML和JSON样例,检查转换过程是否保持了数据的一致性,包括标签、属性、文本节点以及嵌套结构等。 在...
XML(Extensible Markup Language)和Json(JavaScript Object Notation)是两种常见的数据交换格式,广泛应用于客户端和服务端之间的通信。XML提供了丰富的结构化表示,而Json因其简洁轻量级的特性在现代API中更受...
4. **Spring框架**:Spring是Java开发中最流行的服务端框架之一,提供了Model-View-Controller(MVC)架构,简化了客户端与服务端的交互。Spring MVC模块支持RESTful Web服务,便于创建高效、可测试的API。 5. **...
这些文件可以帮助我们理解服务端的实现细节,以及客户端如何与之通信。通过分析这些文件,我们可以学习到如何在实际项目中应用Axis1.4来构建和使用Web服务。 总的来说,Axis1.4服务端的编写涉及Web服务的基础概念,...
为了处理 POST 请求中的 XML 数据,`dxServlet.java` 使用了 SAX(Simple API for XML)解析器。SAX 是一种基于事件驱动的 XML 解析方式,非常适合大型文档的解析。它不一次性加载整个 XML 文档到内存中,而是随着...
此外,XML Schema(XSD)和XML DTD(文档类型定义)也会被介绍,它们用于定义XML文档的结构和验证规则。 随着.NET框架的更新,本书还会涵盖WCF(Windows Communication Foundation)和Web API,它们是构建基于XML的...
XMLBean通过XSD(XML Schema Definition)文件将XML结构转换为Java类。这些Java类可以直接用来创建、访问和修改XML文档,就像操作普通Java对象一样。这样,开发者可以避免直接处理复杂的DOM或SAX解析,提高了代码的...