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

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

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

XML解析类

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


class anl_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");
	const char* data_name[5] = { "new-1","int","3","0","修改的" };
	xml.update_xml("rtdb","new",data_name);

	return 0;
}

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())
	{
		const char* 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)
			{
				const char* name = elem1->Attribute("name"); // data节点下的属性
				const char* type = elem1->Attribute("type"); // data节点下的属性
				const char* init = elem1->Attribute("init"); // data节点下的属性
				const char* length = elem1->Attribute("length"); // data节点下的属性
				cout << data_name << ":" << name << " " << type << " " << init << " " << length << endl; // 加上空格
			}
		}
		break; // 找到这个node_name 节点就退出
	}
	return true;
}

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 = new TiXmlElement("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;
	}
	return true;
}

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 节点就退出
	}
	return true;
}

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;
	}
	return true;
}

总结

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


版权声明:本文为weixin_45715405原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。