《c++解析xml文件实际应用(增删改查进阶)看完必会》
下载Tinyxml资源
Tinyxml下载:
https://sourceforge.net/projects/tinyxml/
在这里插入图片描述
下载完成之后进行解压,tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp 6个文件放在你的项目目录下,你自己写的头文件和.cpp文件所在的目录
在你的程序文件中引入头文件
#include "tinystr.h"
#include "tinyxml.h"
vs需要把.cpp文件,拖到源文件夹中,.h头文件不用,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
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");
}
在这里插入图片描述
2 删除节点属性及其子节点操作(删)
在这里插入图片描述
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");
}
在这里插入图片描述
在这里插入图片描述
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");
}
在这里插入图片描述
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>
在这里插入图片描述
// 遍历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;// 加上空格
}
}
}
输出结果
在这里插入图片描述