目录

一:创建xml文件

注意重点:

要在文件中使用命名空间using namespace tinyxml2;设置存储格式

创建xml文件

二:读取xml文件

三:删除某个节点(重点在于删除修改后保存即可)

四:修改某个节点属性


重点:
git地址:https://github.com/leethomason/tinyxml2
tinyxml2的安装非常简单,从git下载,一共只需要两个文件tinyxml2.h和tinyxml2.cpp。而且tingxml2和C++版本无关,不依赖于STL和RTTI。所有任何版本的C++都能使用。

使用教程(这篇文件比较详细):

(3)TinyXml2的详解及使用 - MenAngel - 博客园 (cnblogs.com)

如果要存储下拉格式的数据

一:创建xml文件

注意重点:

要在文件中使用命名空间
using namespace tinyxml2;
设置存储格式


struct CadLayer
{
public:CadLayer(vector<string> la = {}) :layers(la) {};vector<string> layers;
};struct Layer
{
public:Layer(const string& n, const string& c, CadLayer l = {}) :name(n), check(c), layer(l) {};string name;string check;CadLayer layer;
};struct Floor
{
public:Floor(const string& n,vector<Layer> l = {}) :name(n), lay(l) {};string name;vector<Layer> lay;
};
void Init(vector<Floor>& vec)
{Layer layer1{ "主轴轴符","true"};CadLayer cadly{ {"WALL","COLU"} };Layer layer2{ "墙边线","true",cadly };vector<Layer> floorLay{ layer1 ,layer2 };Floor floor1{ "1",floorLay };Layer layer3{ "主轴轴符","true" };CadLayer cadly2{ {"WALL"} };Layer layer4{ "墙边线","false",cadly2 };vector<Layer> floorLay2{ layer3 ,layer4};Floor floor2{ "2",floorLay2 };vec.emplace_back(floor1);vec.emplace_back(floor2);
}

创建xml文件

//创建xml文件
bool CreateXMLFile(const string& path,const vector<Floor>& vec)
{// 新建一个空文档(表示完整的xml)tinyxml2::XMLDocument xmlDoc;// 新节点XMLNode* pRoot = xmlDoc.NewElement("Root");// 插入到xmlDoc的第一个节点(根节点)xmlDoc.InsertFirstChild(pRoot);for (const auto&var:vec){if (var.name==""){continue;}// 新建一个元素XMLElement* pElement = xmlDoc.NewElement("Floor");// 设置该元素的属性(重载)string tempStr = var.name;pElement->SetAttribute("name", tempStr.c_str());// 将该节点添加到pRoot节点下("Root")pRoot->InsertEndChild(pElement);for (const auto& la: var.lay){if (la.name == ""){continue;}// 指向新的节点XMLElement* newEle = xmlDoc.NewElement("Layer");tempStr = la.name;newEle->SetAttribute("name", tempStr.c_str());tempStr = la.check;newEle->SetAttribute("check", tempStr.c_str());//处理cadlayerCadLayer layer = la.layer;for (const auto& layers : layer.layers){if (layers== ""){continue;}XMLElement* nodeEle = xmlDoc.NewElement("CadLayer");// 设置节点的值tempStr = layers;nodeEle->SetText(tempStr.c_str());newEle->InsertEndChild(nodeEle);}pElement->InsertEndChild(newEle);}}//如果没保存成功则返回错误if (xmlDoc.SaveFile(path.c_str()) != XML_SUCCESS){return false;}
}
int main()
{//初始化数据vector<Floor> vec;Init(vec);//处理路径string path = "D://IniFile//testXml.xml";CreateXMLFile(path, vec);return 0;
}

二:读取xml文件

//读取xml文件
bool ReadXMLFile(const string& path, vector<Floor>& vec)
{//检查文件是否存在if (!std::filesystem::exists(path)){return false;}// 新建一个xml对象tinyxml2::XMLDocument xmlDoc;// 读取指定的xml文件并判断读取是否成功XMLError eResult = xmlDoc.LoadFile(path.c_str());if (eResult != XML_SUCCESS){return false;}//查找节点对应的信息XMLElement* pRoot = xmlDoc.RootElement();XMLElement* ptrNode = pRoot->FirstChildElement();do{if (ptrNode->Attribute("name") != NULL){//获取floor名称string floorName = ptrNode->Attribute("name");Floor floor{ floorName };//获取每个layer节点for (XMLElement* ptrElement = ptrNode->FirstChildElement("Layer"); ptrElement; ptrElement = ptrElement->NextSiblingElement("Layer")){          //获取提取图层名称name和勾选状态checkstring layerStr = ptrElement->Attribute("name");string checkStr = ptrElement->Attribute("check");vector<string> cadlays;//对于cadlayer节点信息进行存储for (const XMLNode* tempNode = ptrElement->FirstChild(); (tempNode != NULL && tempNode->FirstChildElement() == NULL); tempNode = tempNode->NextSibling()){string cadLayerStr = tempNode->ToElement()->GetText();if (cadLayerStr == ""){continue;}cadlays.emplace_back(cadLayerStr);              }Layer lay{ layerStr ,checkStr ,cadlays };floor.lay.emplace_back(lay);}vec.emplace_back(floor);}ptrNode = ptrNode->NextSiblingElement();} while (ptrNode != NULL);
}
int main()
{//处理路径string path = "D://IniFile//testXml.xml";vector<Floor> tempVec;ReadXMLFile(path, tempVec);return 0;
}

三:删除某个节点(重点在于删除修改后保存即可)

比如删除floor中name为1的节点

bool DeleteFloorNode(const string& path, const string& fName)
{//检查文件是否存在if (!std::filesystem::exists(path)){return false;}// 新建一个xml对象tinyxml2::XMLDocument xmlDoc;// 读取指定的xml文件并判断读取是否成功XMLError eResult = xmlDoc.LoadFile(path.c_str());if (eResult != XML_SUCCESS){return false;}//查找节点对应的信息XMLElement* pRoot = xmlDoc.RootElement();XMLElement* ptrNode = pRoot->FirstChildElement();do{if (ptrNode->Attribute("name") != NULL){//获取floor名称string floorName = ptrNode->Attribute("name");if (fName == floorName){pRoot->DeleteChild(ptrNode);break;}}ptrNode = ptrNode->NextSiblingElement();} while (ptrNode != NULL);//保存数据if (xmlDoc.SaveFile(path.c_str()) != XML_SUCCESS){return false;}
}
int main()
{//处理路径string path = "D://IniFile//testXml.xml";DeleteFloorNode(path, "2");return 0;
}

结果:

 
四:修改某个节点属性

将floor的name 由1改成3

bool ChangeFloorNode(const string& path, const string& fName)
{//检查文件是否存在if (!std::filesystem::exists(path)){return false;}// 新建一个xml对象tinyxml2::XMLDocument xmlDoc;// 读取指定的xml文件并判断读取是否成功XMLError eResult = xmlDoc.LoadFile(path.c_str());if (eResult != XML_SUCCESS){return false;}//查找节点对应的信息XMLElement* pRoot = xmlDoc.RootElement();XMLElement* ptrNode = pRoot->FirstChildElement();do{if (ptrNode->Attribute("name") != NULL){//获取floor名称string floorName = ptrNode->Attribute("name");if (floorName==fName){ptrNode->SetAttribute("name", "3");}break;}ptrNode = ptrNode->NextSiblingElement();} while (ptrNode != NULL);//保存数据if (xmlDoc.SaveFile(path.c_str()) != XML_SUCCESS){return false;}
}
int main()
{//处理路径string path = "D://IniFile//testXml.xml";vector<Floor> tempVec;ChangeFloorNode(path, "1");return 0;
}

tinyxml2存储xml数据简单高效相关推荐

  1. TinyXML-2解析XML数据

    声明 本文例子源自在C++中使用TinyXML2解析xml一文,其余部分来源于网络搜集,难免疏漏,敬请随意吐槽. XML以及JSON 什么是XML 根据Wikipedia-XML的说法: 可扩展标记语 ...

  2. 一起谈.NET技术,浅谈如何使用.NET存储XML数据

    XML Bulk Load和Updategrams,这两种客户端技术使用带有注解的大纲指定XML文档内容和数据库的表之间的映射:OpenXML是一种服务器端技术,它允许你在XML文档上定义关系视图,有 ...

  3. tinyxml2 数组_7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml...

     数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...

  4. 基于AndroidStudio的数据存储(SharedPreferences存储)的简单应用

    基于AndroidStudio的数据存储(SharedPreferences存储)的简单应用 前言 一.登录界面设计 二.MainActivity_10_5 中 前言 在手机的登录界面输入用户名和密码 ...

  5. php xml 格式化,php简单处理XML数据的方法示例

    本文实例讲述了php简单处理XML数据的方法.分享给大家供大家参考,具体如下: 把XML转换成对象直接调用里面的属性 $note=<< Tove Jani Reminder XML; $x ...

  6. android数据存储_SharedPreferences的简单使用

    SharedPreferences的写数据简单使用步骤如下: 第一步:获取SharedPreferences对象 第二步:获取SharedPreferences.Editor对象 第三步:通过此Edi ...

  7. NeurIPS2021 MBT:多模态数据怎么融合?谷歌提出基于注意力瓶颈的方法,简单高效还省计算量...

    关注公众号,发现CV技术之美 本文分享 NeurIPS 2021 论文『Attention Bottlenecks for Multimodal Fusion』,思考<MBT>多模态数据怎 ...

  8. MOTChallenge榜单第一!用于多目标跟踪简单高效的数据关联方法 BYTE

    关注公众号,发现CV技术之美 本文获作者授权转载自知乎: https://zhuanlan.zhihu.com/p/421264325? 本文主要介绍一下我们最近的一篇工作: ByteTrack: M ...

  9. 简单使用SAXReader解析xml数据

    之前的工作中,一直是使用json格式的数据进行数据传输.很少会接触到xml格式的数据.不过因为工作需求,在对接其他产品的接口时,偶尔会遇到需要使用xml格式数据的情况,所以,也得学学如何解析xml.不 ...

最新文章

  1. 必须重启计算机才能关闭用户控制,Win10如何彻底关闭用户帐户控制?Win10关闭用户控制方法...
  2. WebVie打开woffice文档
  3. 数据中心冷热空气流控制优化方案
  4. textview多行ellipsize=end不显示省略号的解决方法(一)
  5. 进腾讯实习要交钱?腾讯2021年开除70名员工,拉黑13家公司
  6. 第一模块:开发基础 第1章·Python基础语法
  7. 视图 索引 存储过程
  8. poj1942——组合数学
  9. mysql 分库备份
  10. OnCreate()和PreCreateWindow()函数的区别
  11. 项目管理49个过程超详细总结(持续更新中)
  12. 迪文屏程序制作。通讯
  13. 正大市场监管总局、发改委、证监会联合提醒告诫部分铁矿石
  14. Windows XP中手动安装驱动程序的方法
  15. 安装关系型数据库MySQL和大数据处理框架Hadoop
  16. 非线性系统【五】|线性时变系统和线性化,逆定理
  17. Javaweb day05
  18. 惠普之路——HP公司发展史
  19. python图像数据是几维数据_Numpy高维数据的理解
  20. Mac下shell 脚本定时运行

热门文章

  1. 移植RTT--官方教程
  2. 【小程序测试】接口测试
  3. 开个公众号 大数据务虚杂谈 ;)
  4. 初学Java开发的学习路线图是什么?
  5. 指令集与CPU架构概念与联系
  6. 以爱情为主题写100句诗歌
  7. 持续集成:Jenkins pipeline全局变量
  8. APP测试常见功能测试点汇总,赶紧来记笔记
  9. 抽取原理的案例_庭院设计经验:花园水景水池假山怎么做好看?看看这几十个案例...
  10. Laravel 好玩、好用扩展推荐(持续更新)