《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文件实际应用(增删改查进阶)看完必会_#include

在这里插入图片描述

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文件实际应用(增删改查进阶)看完必会_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文件实际应用(增删改查进阶)看完必会_xml_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文件大部分代码都差不多,掌握核心最重要