首页 > 编程语言 >c++解析xml文件实际应用(增删改查进阶)看完必会

c++解析xml文件实际应用(增删改查进阶)看完必会

时间:2024-08-30 10:28:41浏览次数:13  
标签:xml node 进阶 改查 elem elem1 data 节点 name

《c++解析xml文件(增删改查)看完必会》

遍历xml所有节点下的数据已经在上一篇文章末尾写道,写法大同小异,资源下载也在上一篇提到, 这里就不再提及,这篇博客主要是对上一篇基础知识的运用,如有疑问,可以call我

XML解析类

#include <iostream>
#include <string>
#include <string.h>
#include "tinystr.h"
#include "tinyxml.h"
usingnamespace std;


classanl_Xml
{
public:
char* m_Filename;
TiXmlDocument xmlDocument;
anl_Xml(string filename)
{
        m_Filename =&filename[0];
init();
}
void init()
    {
if(!xmlDocument.LoadFile(m_Filename))// 需要解析的xml文件
{
            cout <<"未找到文件"<< endl;
}
else
{
            cout <<"成功!!"<< endl;
}

}
bool display_xml(const char* node_name, const char* data_name);// 指定节点 下的指定数据打印输出
bool insert_xml(const char* node_name, const char* data_name[]);// 指定节点下添加一条数据
bool del_xml(const char* node_name, const char* data_name);// 指定节点下删除 指定数据
bool update_xml(const char* node_name,const char* update_name, const char* data_name[]);// 指定节点和数据,进行修改
};

int main()
{

anl_Xml xml("D:/visual_2019_project/Project7/new.xml");
//xml.display_xml("rtdb","HmiLoopCount");
//const char* data_name[5] = {"new","long","8","0","新添加"};
//xml.insert_xml("rtdb", data_name);
//xml.del_xml("rtdb", "new");
constchar* data_name[5]={"new-1","int","3","0","修改的"};
    xml.update_xml("rtdb","new",data_name);

return0;
}

1 指定节点名和节点下的属性(查)

c++解析xml文件实际应用(增删改查进阶)看完必会_xml

在这里插入图片描述

bool anl_Xml::display_xml(const char* node_name, const char* data_name)
{ // node_name ="rtdb"   节点名, data_name="HmiLoopCount" 节点下的数据名

TiXmlElement* xmlRoot = xmlDocument.RootElement();// 找根节点
// 找根节点下名字为 node_name的节点
for(TiXmlElement* elem = xmlRoot->FirstChildElement(node_name); elem !=NULL; elem = elem->NextSiblingElement())
{
constchar* node_attribute = elem->Attribute("name");// 找到node_name节点的name属性,返回值const char*
        cout << node_name<<"的name属性= "<< node_attribute<<endl;

for(TiXmlElement* elem1 = elem->FirstChildElement(); elem1 !=NULL; elem1 = elem1->NextSiblingElement())
{
if(strcmp(elem1->Attribute("name"),data_name)==0)
{
constchar* name = elem1->Attribute("name");// data节点下的属性
constchar* type = elem1->Attribute("type");// data节点下的属性
constchar* init = elem1->Attribute("init");// data节点下的属性
constchar* length = elem1->Attribute("length");// data节点下的属性
                cout << data_name <<":"<< name <<" "<< type <<" "<< init <<" "<< length << endl;// 加上空格
}
}
break;// 找到这个node_name 节点就退出
}
returntrue;
}

2 指定节点 往里面添加一条数据(添加)

c++解析xml文件实际应用(增删改查进阶)看完必会_数据_02

在这里插入图片描述

bool anl_Xml::insert_xml(const char* node_name, const char* data_name[])
{ // node_name ="rtdb"   节点名, 

TiXmlElement* xmlRoot = xmlDocument.RootElement();// 找根节点
// 找根节点下名字为 node_name的节点
for(TiXmlElement* elem = xmlRoot->FirstChildElement(node_name); elem !=NULL; elem = elem->NextSiblingElement())
{
TiXmlElement* xmlChild1 =newTiXmlElement("data");
        elem->LinkEndChild(xmlChild1);
        xmlChild1->SetAttribute("name", data_name[0]);//设置属性
        xmlChild1->SetAttribute("type", data_name[1]);//设置属性
        xmlChild1->SetAttribute("length", data_name[2]);//设置属性
        xmlChild1->SetAttribute("init", data_name[3]);//设置属性
        xmlChild1->SetAttribute("description", data_name[4]);//设置属性
//保存xml文件
        xmlDocument.SaveFile("new.xml");
break;
}
returntrue;
}

3 指定节点和节点下的数据删除(删除)

c++解析xml文件实际应用(增删改查进阶)看完必会_xml_03

在这里插入图片描述

bool anl_Xml::del_xml(const char* node_name, const char* data_name)
{ // node_name ="rtdb"   节点名, data_name="HmiLoopCount" 节点下的数据名

TiXmlElement* xmlRoot = xmlDocument.RootElement();// 找根节点
// 找根节点下名字为 node_name的节点
for(TiXmlElement* elem = xmlRoot->FirstChildElement(node_name); elem !=NULL; elem = elem->NextSiblingElement())
{
for(TiXmlElement* elem1 = elem->FirstChildElement(); elem1 !=NULL; elem1 = elem1->NextSiblingElement())
{
if(strcmp(elem1->Attribute("name"), data_name)==0)
{
                elem->RemoveChild(elem1);// 删除指定数据
                xmlDocument.SaveFile("new.xml");
break;
}
}
break;// 找到这个node_name 节点就退出
}
returntrue;
}

4 指定节点和数据进行修改(修改)

c++解析xml文件实际应用(增删改查进阶)看完必会_#include_04

在这里插入图片描述

bool anl_Xml::update_xml(const char* node_name, const char* update_name, const char* data_name[])
{ // node_name ="rtdb"   节点名, 

TiXmlElement* xmlRoot = xmlDocument.RootElement();// 找根节点
// 找根节点下名字为 node_name的节点
for(TiXmlElement* elem = xmlRoot->FirstChildElement(node_name); elem !=NULL; elem = elem->NextSiblingElement())
{
for(TiXmlElement* elem1 = elem->FirstChildElement(); elem1 !=NULL; elem1 = elem1->NextSiblingElement())
{
if(strcmp(elem1->Attribute("name"), update_name)==0)
{
                elem1->SetAttribute("name", data_name[0]);//设置属性
                elem1->SetAttribute("type", data_name[1]);//设置属性
                elem1->SetAttribute("length", data_name[2]);//设置属性
                elem1->SetAttribute("init", data_name[3]);//设置属性
                elem1->SetAttribute("description", data_name[4]);//设置属性
//保存xml文件
                xmlDocument.SaveFile("new.xml");
break;
}
}
break;
}
returntrue;
}

总结

解析xml文件大部分代码都差不多,掌握核心最重要


标签:xml,node,进阶,改查,elem,elem1,data,节点,name
From: https://blog.51cto.com/u_14618022/11874597

相关文章

  • Datawhale X 李宏毅苹果书AI夏令营深度学习进阶(二)
    一.动量法在上一个博客中,我们提到了动量法,现在继续补充如图所示,红色表示负梯度方向,蓝色虚线表示前一步的方向,蓝色实线表示真实的移动量。一开始没有前一次更新的方向,完全按照梯度给指示往右移动参数。负梯度方向跟前一步移动的方向加起来,得到往右走的方向。一般梯度下降走到一......
  • 【C/C++进阶】——文件操作之文本文件与二进制文件指针读写
    【文件】——操作文件目录一:文件的定义二:文件名三:文件类型3.1:二进制文件3.2:文本文件四:文件的打开与关闭4.1:文件指针4.2:文件的打开与关闭五:文件的顺序读写5.1:读写字符5.2:读写字符串5.3:读写格式化数据六:文件的随机读写6.1:fseek6.2:ftell6.3:rewind七:文件读取结......
  • Datawhale AI 夏令营 第五期 CV方向 02进阶
    上次的baseline方案,训练的模型,获得分数并不高,DataWhale提供了两个上分的思路增加训练数据集切换不同模型预训练权重增加训练集的大小通常可以提高模型的泛化能力,因为更多的数据可以帮助模型学习到更多的特征和模式。但是,越大的数据集,就意味着需要更多的计算资源和时间来训......
  • 剖析企业报表工具全攻略:从基础到进阶,盘点六大常见的报表工具需求
    在科技日新月异的今天,各行业的数据规模急剧膨胀,特别是对于财务工作人员而言,如何高效、直观地将纷繁复杂的数据以期望的形式呈现出来,成为了日常工作中的一大挑战。为解决这一问题,报表工具应运而生,它们如同一座桥梁,连接着数据与决策者的洞察之间。然而,面对市场上琳琅满目的报表工......
  • IM项目:进阶版即时通讯项目---用户管理(纯业务)
    文章目录服务重写用户注册用户登录验证码获取手机号注册手机号登录获取用户信息获取多个用户的信息设置用户头像添加用户昵称设置用户签名设置手机号服务搭建本篇主要是对于该项目的用户管理模块做一个文档说明,前面已经封装好了类的操作,因此本篇开始直接进行使用本......
  • Clickhouse 配置中文详细介绍 第一章 config.xml
    Clickhouse的配置太多且难以理解,花了两天逐步理解每个配置的作用并逐段机翻了一下注释,并增加了如何配置的建议<!--NOTE:Userandquerylevelsettingsaresetupin"users.xml"file.Ifyouhaveaccidentallyspecifieduser-levelsettingshere,serverwo......
  • 第44天:WEB攻防-PHP应用&SQL盲注&布尔回显&延时判断&报错处理&增删改查方式
    #PHP-MYSQL-SQL操作-增删改查1、功能:数据查询查询:SELECT*FROMnewswhereid=$id2、功能:新增用户,添加新闻等增加:INSERTINTOnews(字段名)VALUES(数据)3、功能:删除用户,删除新闻等删除:DELETEFROMnewsWHEREid=$id4、功能:修改用户,修改文章等修改:UPDATEnewsSETid=......
  • 如何提升单片机开发技能:从基础到进阶的全方位指南
    单片机(MicrocontrollerUnit,MCU)作为嵌入式系统的核心,广泛应用于家电控制、智能设备、工业自动化等领域。随着物联网(IoT)和智能设备的普及,单片机开发技能的提升变得愈发重要。本文将探讨如何从基础知识开始,逐步掌握单片机开发的核心技能,并向高级开发者进阶。目录1.夯实基础:......
  • 我的新书《Android系统多媒体进阶实战》正式发售
    我的新书要正式发售了,把链接贴在下面,感兴趣的朋友可以支持下。❶发售平台:当当,京东,抖音北航社平台,小红书,b站❷目前当当和京东已开启预售❸当当网https://u.dangdang.com/KIDHJ❹京东商城https://item.m.jd.com/product/10109083199634.html?gx=RnAoqRAjajbdh8lR5Q&gxd......
  • 【Python进阶】学会Python之后,尝试做一个信息管理系统
    用Python做一个学生信息管理系统,源码可分享如果你也是刚入门的小伙伴呢,小编为你们准备了入门Python学习籽料和Python入门实践,点击领取(无偿获得)要求:创建一个简单的学生信息管理系统,能够存储学生的姓名、年龄和成绩。系统支持两个功能:添加学生信息和显示所有学生信息。学生信......