C++使用tinyxml库处理XML文件

 更新时间:2023年07月27日 08:37:35   作者:大白曰梦想家  
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树,本文为大家介绍的是使用tinyxml库处理XML文件,需要的可以参考一下

一、下载tinyxml

https://sourceforge.net/projects/tinyxml/
打开网页,点击Download下载后,里面包含了:tinyxml.h、tinystr.h、tinyxml.cpp、tinystr.cpp、tinyxmlparser.cpp、tinyxmlerror.cpp等文件。

二、创建一个XML文件

#include<stdio.h>
#include "tinyxml.h"
using namespace std;
int main(){
	TiXmlDocument* tinyXmlDoc = new TiXmlDocument();//创建一个XML	
	TiXmlDeclaration* tinyXmlDeclare = new TiXmlDeclaration("1.0", "utf-8", "指定是否在XML中包含独立性声明");//创建头部信息	
	tinyXmlDoc->LinkEndChild(tinyXmlDeclare);// 插入文档类中	
	TiXmlElement* Root = new TiXmlElement("Root");// 创建根节点的名称
	tinyXmlDoc->LinkEndChild(Root);	// 把根节点插入到XML中
	TiXmlElement *Child_one = new TiXmlElement("Child_one");//添加子节点Child_one
	Child_one->SetAttribute("Name", "大明");  //设置节点的属性
	Child_one->SetAttribute("Gender", "Male");
	Child_one->SetAttribute("Age", "40");
	TiXmlText *Hobby = new TiXmlText("爱好:游泳");	// 创建文本
	Child_one->LinkEndChild(Hobby);	// 给Child_one节点添加文本
	TiXmlElement *Sunzi_one = new TiXmlElement("Sunzi_one"); //创建Sunzi_one节点
	Sunzi_one->SetAttribute("Name", "小明");  //设置节点的属性
	Sunzi_one->SetAttribute("Gender", "Male");
	Sunzi_one->SetAttribute("Age", "16");
	TiXmlText *Sunzione_hobby = new TiXmlText("爱好:象棋");	// 创建文本
	Sunzi_one->LinkEndChild(Sunzione_hobby);	// 给Sunzi_one节点添加文本
	Child_one->LinkEndChild(Sunzi_one);		// Sunzi_one节点插入到Child_one节点下
	TiXmlElement *Sunzi_two = new TiXmlElement("Sunzi_two"); //创建Sunzi_two节点
	Sunzi_two->SetAttribute("Name", "小创");  //设置节点的属性
	Sunzi_two->SetAttribute("Gender", "Male");
	Sunzi_two->SetAttribute("Age", "14");
	TiXmlText *Sunzitwo_hobby = new TiXmlText("爱好:武术");	// 创建文本
	Sunzi_two->LinkEndChild(Sunzitwo_hobby);	// 给Sunzi_two节点添加文本
	Child_one->LinkEndChild(Sunzi_two);		// Sunzi_two节点插入到Child_one节点下
	TiXmlElement *Sunzi_three = new TiXmlElement("Sunzi_three"); //创建Sunzi_three节点
	Sunzi_three->SetAttribute("Name", "小花");  //设置节点的属性
	Sunzi_three->SetAttribute("Gender", "Female");
	Sunzi_three->SetAttribute("Age", "13");
	TiXmlText *Sunzithree_hobby = new TiXmlText("爱好:跳舞");	// 创建文本
	Sunzi_three->LinkEndChild(Sunzithree_hobby);	// 给Sunzi_three节点添加文本
	Child_one->LinkEndChild(Sunzi_three);		// Sunzi_three节点插入到Child_one节点下
	Root->LinkEndChild(Child_one);	//子节点Child_one插入到Root节点下
	//保存xml文件
	bool result = tinyXmlDoc->SaveFile("C:/Users/Administrator/Desktop/result.xml");//将tinyXmlDoc写入xml文件
	if (result == true) printf("XML文件写入成功!\n");
	else printf("XML文件写入失败!\n");
	tinyXmlDoc->Print(); //控制台打印XML
	system("pause");
	return 0;
} 

三、XML文件增加数据

#include<stdio.h>
#include "tinyxml.h"
using namespace std;
int main(){	
	TiXmlDocument* tinyXmlDoc = new TiXmlDocument("C:/Users/Administrator/Desktop/result.xml");// 读取xml文件
	tinyXmlDoc->LoadFile(TIXML_ENCODING_LEGACY);
	TiXmlDeclaration *pDeclar = tinyXmlDoc->FirstChild()->ToDeclaration(); // 读取xml的头部信息
	if (pDeclar != NULL) {
		printf("头部信息: version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
	}
	TiXmlElement *Root = new TiXmlElement("Root");//获取根节点
	Root = tinyXmlDoc->RootElement();
	TiXmlElement *Child_two = new TiXmlElement("Child_two");
	// 插入属性
	Child_two->SetAttribute("Name", "大华");  //设置节点的属性
	Child_two->SetAttribute("Gender", "Male");
	Child_two->SetAttribute("Age", "38");
	TiXmlText *Hobby = new TiXmlText("爱好围棋");	// 创建文本
	Child_two->LinkEndChild(Hobby);	// 给Child_two节点添加文本
	TiXmlElement *Description = new TiXmlElement("Description");
	TiXmlText *descriptionText = new TiXmlText("还喜欢学习编程");		// 创建文本
	Description->LinkEndChild(descriptionText);		// 给Description节点添加文本
	Child_two->LinkEndChild(Description);				// 插入到Book1节点下
	Root->LinkEndChild(Child_two);	// 插入到根节点下
	// 保存到文件	
	bool result = tinyXmlDoc->SaveFile("C:/Users/Administrator/Desktop/result.xml");
	if (result == true) printf("XML文件写入成功!\n");
	else printf("XML文件写入失败!\n");
	tinyXmlDoc->Print(); //控制台打印XML
	system("pause");
	return 0;
} 

运行3次后,结果如下图:

四、修改XML文件

#include<stdio.h>
#include "tinyxml.h"
using namespace std;
int main(){	
	// 读取xml文件
	TiXmlDocument* tinyXmlDoc = new TiXmlDocument("C:/Users/Administrator/Desktop/result.xml");
	tinyXmlDoc->LoadFile(TIXML_ENCODING_LEGACY);
	TiXmlDeclaration *pDeclar = tinyXmlDoc->FirstChild()->ToDeclaration();// 读取xml的头部信息
	if (pDeclar != NULL) {
		printf("头部信息: version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
	}
	TiXmlElement *Root = new TiXmlElement("Root"); //获取根节点
	Root = tinyXmlDoc->RootElement();
	// 循环查找Child_two节点,修改属性值
	TiXmlElement *Child_two = new TiXmlElement("Child_two");
	TiXmlElement* pItem = Root->FirstChildElement("Child_two");
	for (; pItem != NULL; pItem = pItem->NextSiblingElement("Child_two")) {
		// 找到属性Name=大华的节点
		if (strcmp(pItem->Attribute("Name"), "大华") == 0) {
			pItem->SetAttribute("Age", "39");
			// 设置Child_two的子节点Description的值
			TiXmlElement* Description = pItem->FirstChildElement("Description");	// 获得<Description>还喜欢学习编程</Description>
			TiXmlNode* des = Description->FirstChild();	// 获取元素指针		// 获得存储 "还喜欢学习编程" 的指针
			des->SetValue("最讨厌编程");	// 重新为其设置值				
		}
	}
	// 保存xml到文件	
	bool result = tinyXmlDoc->SaveFile("C:/Users/Administrator/Desktop/result.xml");
	if (result == true) printf("XML文件写入成功!\n");
	else printf("XML文件写入失败!\n");
	tinyXmlDoc->Print(); //控制台打印XML
	system("pause");
	return 0;
} 

五、解析XML文件

#include<stdio.h>
#include "tinyxml.h"
using namespace std;
int main() 
{
	TiXmlDocument* tinyXmlDoc = new TiXmlDocument("C:/Users/Administrator/Desktop/result.xml");// 定义一个TiXmlDocument类指针
	tinyXmlDoc->LoadFile(TIXML_ENCODING_LEGACY);
	//读取xml的头部信息
	TiXmlDeclaration* pDeclar = tinyXmlDoc->FirstChild()->ToDeclaration();
	if (pDeclar != NULL) {
		printf("Header info,version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
		printf("\n");
	}
	//获取文件根节点
	TiXmlElement* Root = new TiXmlElement("Root");
	if (Root){
		Root = tinyXmlDoc->RootElement();
	}
	// 解析Child_one节点
	TiXmlElement* Child_one = Root->FirstChildElement("Child_one");
	if (Child_one){
		printf("Child_one : %s\n", Child_one->GetText());
		printf("\n");
	}
	TiXmlElement* pItem = Root->FirstChildElement("Child_two");  // 函数FirstChildElement():找到指定名字的元素
	if (pItem){
		for (; pItem != NULL; pItem = pItem->NextSiblingElement("Child_two"))// 函数NextSiblingElement:在同一级元素中查找下一个指定名字的元素
		{
			// 解析Child_two节点的属性
			printf("Child_two: \n");
			printf("Name = %s\n", pItem->Attribute("Name"));
			printf("Gender = %s\n", pItem->Attribute("Gender"));
			printf("Age = %s\n", pItem->Attribute("Age"));
			// 解析Child_two的子节点
			TiXmlElement* Description = pItem->FirstChildElement("Description");
			if(Description){
				printf("Description = %s\n", Description->GetText());
			}
			printf("\n");
		}
	}
	printf("\n");
	system("pause");
}

六、XML文件删除数据

#include<stdio.h>
#include "tinyxml.h"
using namespace std;
int main() 
{
	TiXmlDocument* tinyXmlDoc = new TiXmlDocument("C:/Users/Administrator/Desktop/result.xml");// 定义一个TiXmlDocument类指针
	tinyXmlDoc->LoadFile(TIXML_ENCODING_LEGACY);
	//读取xml的头部信息
	TiXmlDeclaration* pDeclar = tinyXmlDoc->FirstChild()->ToDeclaration();
	if (pDeclar != NULL) {
		printf("Header info,version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
		printf("\n");
	}
	//获取文件根节点
	TiXmlElement* Root = new TiXmlElement("Root");
	if (Root){
		Root = tinyXmlDoc->RootElement();
	}
	// 删除Sunzi_two节点的Gender属性
	TiXmlElement* Child_one = Root->FirstChildElement("Child_one");
	TiXmlElement* pItem = Child_one->FirstChildElement("Sunzi_two");
	for (; pItem != NULL; pItem = pItem->NextSiblingElement("Sunzi_two")) {
		// 找到属性Name=小创的节点
		if (strcmp(pItem->Attribute("Name"), "小创") == 0) {
			// 删除Gender属性
			pItem->RemoveAttribute("Gender");
		}
	}
	//删除Child_two节点中属性Name="大华"的节点
	pItem = Root->FirstChildElement("Child_two");
	for (; pItem != NULL; ) {
		// 找到属性Name="大华"的节点
		if (strcmp(pItem->Attribute("Name"), "大华") == 0) {
			// 提前存储删除节点的下一个节点
			TiXmlElement* temporary = pItem->NextSiblingElement("Child_two");
			// 删除当前节点,删除后pItem为NULL,如果再继续使用它会报错
			Root->RemoveChild(pItem->ToElement());
			// 这里要进行赋值回来
			pItem = temporary;
		} else {
			// 寻找下一个Child_two节点
			pItem = pItem->NextSiblingElement("Child_two");
		}
	}
	// 保存到文件	
	bool result = tinyXmlDoc->SaveFile("C:/Users/Administrator/Desktop/result.xml");
	if (result == true) printf("文件写入成功!\n");
	else printf("文件写入失败!\n");
	// 打印出来看看
	tinyXmlDoc->Print();
	printf("\n");
	system("pause");
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了tinyxml的使用,包括创建XML文件及增删改查的操作演示。

到此这篇关于C++使用tinyxml库处理XML文件的文章就介绍到这了,更多相关C++ tinyxml处理XML文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言递归思想实现汉诺塔详解

    C语言递归思想实现汉诺塔详解

    大家好,本篇文章主要讲的是C语言递归思想实现汉诺塔详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • matlab模拟退火算法单约束车间流水线调度解决实现及示例

    matlab模拟退火算法单约束车间流水线调度解决实现及示例

    这篇文章主要为大家介绍了matlab模拟退火算法求解单约束车间流水线调度的实现及示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C++Zip压缩解压缩示例(支持递归压缩)

    C++Zip压缩解压缩示例(支持递归压缩)

    C++Zip压缩解压缩示例,用第三方函数封装而成,支持 UNCODE, ANSCII、支持压缩文件夹、支持递归压缩
    2013-11-11
  • C++如何判断一个数字是否为质数

    C++如何判断一个数字是否为质数

    这篇文章主要为大家详细介绍了C++如何判断一个数字是否为质数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 关于C++使用指针 堆和栈的区别分析

    关于C++使用指针 堆和栈的区别分析

    本篇文章小编为大家介绍,关于C++使用指针 堆和栈的区别分析。需要的朋友参考下
    2013-04-04
  • OpenCV图像处理之直方图比较方法详解

    OpenCV图像处理之直方图比较方法详解

    直方图比较是对输入的两张图像进行计算得到直方图H1与H2,归一化到相同的尺度空间,然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度,进而比较图像本身的相似程度。本文将为大家详细讲讲直方图比较的实现方法,需要的可以参考一下
    2022-09-09
  • c语言定时器示例分享

    c语言定时器示例分享

    在linux下开发,使用的是C语言。适用于需要定时的软件开发,以系统真实的时间来计算,它送出SIGALRM信号。每隔一秒定时一次
    2014-04-04
  • 二进制、八进制 、十进制、十六进制之间转换的原理详解

    二进制、八进制 、十进制、十六进制之间转换的原理详解

    本文介绍了进制的概念及其在C语言编程中的应用,进制是进位制的简称,描述了数值在不同进制下的表示方法,常见的进制包括二进制、八进制和十六进制,二进制使用0和1表示,八进制使用0-7数字表示,十六进制使用0-9和A-F表示,文章还介绍了如何在不同进制之间进行转换
    2024-11-11
  • C语言数组的各种操作梳理

    C语言数组的各种操作梳理

    数组是一组有序的数据的集合,数组中元素类型相同,由数组名和下标唯一地确定,数组中数据不仅数据类型相同,而且在计算机内存里连续存放,地址编号最低的存储单元存放数组的起始元素,地址编号最高的存储单元存放数组的最后一个元素
    2022-04-04
  • 正确理解C++的构造函数和析构函数

    正确理解C++的构造函数和析构函数

    在C++的学习中,可以把类当作一个模具,类实例化出来的对象就是根据这个模具所产生的实体,对象看作是自己创建的一个新的数据类型。本文主要介绍了类对象通过拷贝函数进行初始化,分析类对象的内存模型,以及通过this指针实现更复杂的功能。最后介绍了析构函数的基础知识
    2021-06-06

最新评论