热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++解析XML,TINYXML2的使用

C解析XML,TINYXML2的使用学习使用tinyxml2,参考https:www.cnblogs.comhappykoukoup6307257.html
C++解析XML, TINYXML2的使用

学习使用tinyxml2,参考https://www.cnblogs.com/happykoukou/p/6307257.html,以及官方tinyxml2的test。主要知识:XMLDocument doc;//创建一个dom对象
doc.LoadFile();
doc.Parse(); //将字符串转为dom对象
auto key = doc.NewElement(const char* keyName);//创建一个key
doc.NewText(const char*);//创建一个value
InsertEndChild(key)
FirstChildElement(const char*);
GetText();
SetText(const char*);
NextSiblingElement();//兄弟节点
country.hpp#pragma once//删除指针
#define SAFE_DELETE(pRet) if(pRet != NULL) {delete pRet;pRet = NULL;}
//检查xml中的键是否存在,xml的结构已知,若不存在,直接退出
#define KEY_IS_NULL(key) if(key == nullptr){printf("%s is not found\n",#key);exit(-1);}//为了简单化,以下几个类全部成员函数为public
class Province;
class City;class City
{
public:std::string name;City(const std::string &name):name(name){}
};class Province
{
public:std::string name;std::vector vCities;Province(const std::string &name):name(name){}Province(){}
};class Country
{
public:std::string name;std::vector vProvinces;public:Country(const std::string &name):name(name){}Country(){}/*** 将本类的成员变量序列化到一个固定格式的xml文件中* 采用模板,可以不需要写 tinyxml2的头文件*/templateint parseXML(T &doc, const std::string &fileName){//xml头//R"(string)", string可以以原来的形式存在,“” 不需要转义符const char *declaration = R"()";//将字符串解析到dom对象中doc.Parse(declaration);//new 一个 key//序列化std::string name;auto roof = doc.NewElement("country");auto keyCountryName = doc.NewElement("name");//插入valuekeyCountryName->InsertEndChild(doc.NewText(name.c_str()));//插入roof->InsertEndChild(keyCountryName);doc.InsertEndChild(roof);//序列化std::vector vProvinces;for(auto province : vProvinces){auto keyProvince = doc.NewElement("province");roof->InsertEndChild(keyProvince);auto keyProvinceName = doc.NewElement("name");keyProvinceName->InsertEndChild(doc.NewText(province.name.c_str()));keyProvince->InsertEndChild(keyProvinceName);auto keyCities = doc.NewElement("cities");keyProvince->InsertEndChild(keyCities);//序列化std::vector vCities;for(auto city : province.vCities){auto keyCity = doc.NewElement("city");keyCity->InsertEndChild(doc.NewText(city.name.c_str()));keyCities->InsertEndChild(keyCity);}}//保存为xml文件return doc.SaveFile(fileName.c_str());}//反序列化xml文件成一个对象templateint convertXMLToObject(T &doc, const std::string &fileName){int ret = doc.LoadFile(fileName.c_str());if(ret){return ret;}//查找key,如果不存在,则退出程序。auto keyCountry = doc.FirstChildElement("country");KEY_IS_NULL(keyCountry);auto keyCountryName = keyCountry->FirstChildElement("name");KEY_IS_NULL(keyCountryName);auto countryName = keyCountryName->GetText();if(countryName == nullptr){return -1;}this->name = countryName;auto keyProvince = keyCountry->FirstChildElement("province");//反序列化std::vector vProvinces;while(keyProvince != nullptr){ auto keyProvinceName = keyProvince->FirstChildElement("name");KEY_IS_NULL(keyProvinceName);auto provinceName = keyProvinceName->GetText();if(provinceName != nullptr){Province province(provinceName);auto keyCities = keyProvince->FirstChildElement("cities");KEY_IS_NULL(keyCities);auto keyCity = keyCities->FirstChildElement("city");KEY_IS_NULL(keyCity);//反序列化std::vector vCities;while(keyCity != nullptr){auto cityName = keyCity->GetText();if(cityName != nullptr){City city(cityName);province.vCities.push_back(city);}//继续查找兄弟节点keyCity = keyCity->NextSiblingElement(); }this->vProvinces.push_back(province);}//继续查找兄弟节点keyProvince = keyProvince->NextSiblingElement();}return 0; }//序列化对象到stringstd::string toString(){std::string s; if(!name.empty()){s+= "country name: ";s+= name;}if(!vProvinces.empty()){for(auto province : vProvinces){s+= " province name :";s+= province.name;if(!province.vCities.empty()){s+= " city name: ";for(auto city : province.vCities){s+= city.name;s+= " ";}}}}return s;}};
test.cpp#include
#include
#include
#include
#include "../tinyxml2.h"#include "country.hpp"using namespace tinyxml2;
using namespace std;#define EXIT_ABNOEMAL(msg) {printf("%s\n", msg); return -1;}//构造一个country
Country* getCountry(const string &name)
{auto country = new Country(name);City haerbing("哈尔滨");City daqing("大庆");Province heilongjing("黑龙江");heilongjing.vCities.push_back(haerbing);heilongjing.vCities.push_back(daqing);City guangzhou("广州");City shenzhen("深圳");City zhuhai("珠海");Province guangdong("广东");guangdong.vCities.push_back(guangzhou);guangdong.vCities.push_back(shenzhen);guangdong.vCities.push_back(zhuhai);City taibei("台北");City gaoxiong("高雄");Province taiwan("台湾");taiwan.vCities.push_back(gaoxiong);taiwan.vCities.push_back(taibei);City wulumuqi("乌鲁木齐");Province xinjiang("新疆");xinjiang.vCities.push_back(wulumuqi);country->vProvinces.push_back(xinjiang);country->vProvinces.push_back(heilongjing);country->vProvinces.push_back(guangdong);country->vProvinces.push_back(taiwan);return country;
}//序列化对象到xml
int parseCountryToXml(Country *country, const string &filePath)
{XMLDocument doc;//调用country的序列化函数int ret = country->parseXML(doc, filePath);return ret;
}//反序列化到对象
int readXMLToCountry(Country * country, const string &filePath)
{XMLDocument doc;//调用对象的反序列花方法int ret = country->convertXMLToObject(doc, filePath);return ret;
}int main()
{const string fileName &#61; "../test/country.xml";//将中国对象保存到xml中auto zhongguo &#61; getCountry("zhongguo");int ret;ret &#61; parseCountryToXml(zhongguo, fileName);if(ret){EXIT_ABNOEMAL("convert to xml error!");}//从上面的xml中反序列化成china对象Country *china &#61; new Country();ret &#61; readXMLToCountry(china, fileName);if(ret){EXIT_ABNOEMAL("convert to Object error!");}//输出china对象string s &#61; china->toString();cout<}
结果&#xff1a;country.xml
zhongguo新疆乌鲁木齐黑龙江哈尔滨大庆广东广州深圳珠海台湾高雄台北

 


推荐阅读
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
author-avatar
来人把老师拖出I去毙了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有