《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 指定节点名和节点下的属性(查)
在这里插入图片描述
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 指定节点 往里面添加一条数据(添加)
在这里插入图片描述
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 指定节点和节点下的数据删除(删除)
在这里插入图片描述
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 指定节点和数据进行修改(修改)
在这里插入图片描述
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文件大部分代码都差不多,掌握核心最重要