热门标签 | 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新疆乌鲁木齐黑龙江哈尔滨大庆广东广州深圳珠海台湾高雄台北

 


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
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社区 版权所有