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

下载Tinyxml资源

Tinyxml下载:

https://sourceforge.net/projects/tinyxml/

c++解析xml文件(增删改查)看完必会_插入图片

在这里插入图片描述

下载完成之后进行解压,tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp 6个文件放在你的项目目录下,你自己写的头文件和.cpp文件所在的目录

在你的程序文件中引入头文件

#include "tinystr.h"
#include "tinyxml.h"

vs需要把.cpp文件,拖到源文件夹中,.h头文件不用,

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

1 生成Xml文件(增)

void builder_Xml()
{
TiXmlDocument xmlDocument;

// 添加XML声明
    xmlDocument.LinkEndChild(newTiXmlDeclaration("1.0","GBK",""));

// 添加根元素
TiXmlElement* xmlRoot =newTiXmlElement("root");
    xmlDocument.LinkEndChild(xmlRoot);

//根元素下添加子元素1
TiXmlElement* xmlChild1 =newTiXmlElement("name");
    xmlRoot->LinkEndChild(xmlChild1);
    xmlChild1->SetAttribute("id","0001");//设置属性
    xmlChild1->LinkEndChild(newTiXmlText("中间值1"));

//根元素下添加子元素2
TiXmlElement* xmlChild2 =newTiXmlElement("s1");
    xmlRoot->LinkEndChild(xmlChild2);

TiXmlElement* xmlChild2_01 =newTiXmlElement("name1");
    xmlChild2->LinkEndChild(xmlChild2_01);
    xmlChild2_01->LinkEndChild(newTiXmlText("中间值2"));

TiXmlElement* xmlChild2_02 =newTiXmlElement("cs");
    xmlChild2->LinkEndChild(xmlChild2_02);
    xmlChild2_02->LinkEndChild(newTiXmlText("8"));
//保存xml文件
    xmlDocument.SaveFile("new.xml");
}

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

在这里插入图片描述

2 删除节点属性及其子节点操作(删)

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

在这里插入图片描述

void del_Xml()
{
TiXmlDocument xmlDocument;
if(!xmlDocument.LoadFile("D:/visual_2019_project/Project1/new.xml"))// 需要解析的xml文件
{
return;
}
TiXmlElement* xmlRoot = xmlDocument.RootElement();// 找根节点
TiXmlElement* elem = xmlRoot->FirstChildElement("name");
    elem->RemoveAttribute("id");//删除name节点的 id属性
    xmlRoot->RemoveChild(elem);// 删除root 下第一个name节点

    xmlDocument.SaveFile("new.xml");
}

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

在这里插入图片描述

c++解析xml文件(增删改查)看完必会_插入图片_08

在这里插入图片描述

3 修改属性值和节点名字(改)

void update_Xml()
{
TiXmlDocument xmlDocument;
if(!xmlDocument.LoadFile("D:/visual_2019_project/Project1/new.xml"))// 需要解析的xml文件
{
return;
}
TiXmlElement* xmlRoot = xmlDocument.RootElement();// 找根节点
TiXmlElement* elem = xmlRoot->FirstChildElement("name");
    elem->SetValue("我是修改");// 将root节点下的name节点进行修改

    elem->SetAttribute("id","我是修改的");// 修改root 下的name节点的id属性(修改就是重新设置然后再保存)

    xmlDocument.SaveFile("new.xml");
}

c++解析xml文件(增删改查)看完必会_插入图片_09

在这里插入图片描述

4 遍历代码(查)

遍历xml文件 我的xml文件:

<?xml version="1.0" encoding="GBK" ?>
<rtdbs>
<rtdb name="system" sync="0" >
<data name="HmiLoopCount" type="ulong" length="4" init="0" description="屏幕刷新次数计数值" />
<data name="HideMainWindow" type="bit" length="1" init="1" description="=1时隐藏主窗口" />
<data name="CurDateTime" type="ulong" length="4" init="0" description="表示1970/1/1以来的秒数" />
<data name="HmiHeartbeat" type="bit" length="1" init="0" description="人机界面运行心跳" />
<data name="HmidbDefCycleTime" type="ulong" length="4" init="500" description="人机界面默认刷新周期(毫秒)" />
<data name="Year" type="ushort" length="2" init="0" description="当前日期(年)" />
<data name="Month" type="uchar" length="1" init="0" description="当前日期(月)" />
<data name="Day" type="uchar" length="1" init="0" description="当前日期(日)" />
<data name="Hour" type="uchar" length="1" init="0" description="当前日期(小时)" />
<data name="Minute" type="uchar" length="1" init="0" description="当前日期(分)" />
<data name="Second" type="uchar" length="1" init="0" description="当前日期(秒)" />
<data name="dcs_rtdb_server_ip" type="string" length="20" init="127.0.0.1" description="实时数据库服务器IP地址" />
<data name="dcs_rtdb_server_timeout" type="long" length="4" init="500" description="" />
<data name="simu_server_ip" type="string" length="20" init="127.0.0.1" description="实时数据库服务器IP地址" />
<data name="simu_server_timeout" type="long" length="4" init="500" description="" />
</rtdb>

<rtdb name="reaml" sync="0" >
<data name="1" type="ulong" length="4" init="0" description="屏幕刷新次数计数值" />
<data name="HmiLoopCount" type="ulong" length="4" init="0" description="屏幕刷新次数计数值" />
</rtdb>


</rtdbs>

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

在这里插入图片描述

// 遍历xml文件
// 我传入的dbname 是rtdb,我需要遍历根节点下的所有rtdb,其实参数可以不用写,因为全部都是rtdb,你们的根据个人而定
void displayxml(const char* dbname)
{
TiXmlDocument xmlDocument;
if(!xmlDocument.LoadFile("D:/visual_2019_project/Project1/rt.xml"))// 需要解析的xml文件
{
return;
}

TiXmlElement* xmlRoot = xmlDocument.RootElement();// 找根节点

// 通过根节点开始遍历下面的所有 名为dbname的子节点,xmlRoot->FirstChildElement();不加参数表示遍历根节点下所有子节点
// 加参数表示遍历名为dbname的子节点 elem = elem->NextSiblingElement()每次向后找下一个
for(TiXmlElement* elem = xmlRoot->FirstChildElement(dbname); elem !=NULL; elem = elem->NextSiblingElement())
{
constchar* arr = elem->Attribute("name");// 取出子节点的属性(rtdb的name属性)
//const char* node1Name = elem->GetText();  // 取出标签中间的值,我的xml文件用不到
        cout <<"rtdb-name属性:"<< arr << endl;

// 通过rtdb继续找他下面的子节点
// 查找方式和上面的一样 (要是下面还有属性可以继续通过这种方式继续找)
for(TiXmlElement* elem1 = elem->FirstChildElement(); elem1 !=NULL; elem1 = elem1->NextSiblingElement())
{
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 << name <<" "<< type<<" "<< init<<" "<< length << endl;// 加上空格
}
}
}

输出结果

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

在这里插入图片描述