C/C++教程

windows系统下C++使用TinyXML读写XML文件

本文主要是介绍windows系统下C++使用TinyXML读写XML文件,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


目录

下载

windows环境编译(假编译)准备  

对xml文件读、写、编辑、删除操作

写文件

读文件 

 删除节点编辑节点


下载

官网:TinyXML download | SourceForge.net

windows环境编译(假编译)准备  

下载完源码后打开发现里边源码就几个

        没必要编译成静态库或者动态库,把上面列举的2个头文件和4个cpp文件拷贝(新建同名文件复制内容进去)到示例工程目录下即可直接使用。

对xml文件读、写、编辑、删除操作

写文件

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

int main()
{
	// 新建的xml文件名字
	string filename = "E:/api/tinyxml/temp/yolo.xml";

	//新建一个xml文件
	// 定义一个TiXmlDocument类指针
	TiXmlDocument* pWriteDoc = new TiXmlDocument();

	// xml的声明(三个属性:版本,编码格式,独立文件声明)
	TiXmlDeclaration* pDeclare = new TiXmlDeclaration("1.0", "UTF-8", "yes");
	pWriteDoc->LinkEndChild(pDeclare);			// 连接到最后

	// 根节点
	TiXmlElement* pRootElement = new TiXmlElement("annotation");
	pWriteDoc->LinkEndChild(pRootElement);		// 把根节点连接到最后

	// 二级节点
	TiXmlElement* pFolderElement = new TiXmlElement("folder");
	pRootElement->LinkEndChild(pFolderElement);	// 连接到根节点下
	TiXmlText* folderContent = new TiXmlText("JPEGImages");	
	pFolderElement->LinkEndChild(folderContent);	// 给folder节点添加文本

	TiXmlElement* pFileNameElement = new TiXmlElement("filename");
	pRootElement->LinkEndChild(pFileNameElement);	// 连接到根节点下
	TiXmlText* fileNameContent = new TiXmlText("1.bmp");
	pFileNameElement->LinkEndChild(fileNameContent);	// 给filename节点添加文本

	TiXmlElement* pPathElement = new TiXmlElement("path");
	pRootElement->LinkEndChild(pPathElement);	// 连接到根节点下
	TiXmlText* pathContent = new TiXmlText("E:/projects/pyHome/about_yolo/yolov5_bottleCap_defect_detection/VOCData/JPEGImages/1.bmp");
	pPathElement->LinkEndChild(pathContent);	// 给path节点添加文本

	TiXmlElement* pSizeElement = new TiXmlElement("size");
	pRootElement->LinkEndChild(pSizeElement);	// 连接到根节点下
	TiXmlElement* pWithElement = new TiXmlElement("width");
	pSizeElement->LinkEndChild(pWithElement);	// 连接到二级节点size节点下的三级节点
	TiXmlText* withContent = new TiXmlText("1280");		// width节点文本
	pWithElement->LinkEndChild(withContent);	// 给三级节点width添加文本
	TiXmlElement* pHeightElement = new TiXmlElement("height");
	pSizeElement->LinkEndChild(pHeightElement);	// 连接到二级节点size节点下的三级节点
	TiXmlText* heightContent = new TiXmlText("960");		// height节点文本
	pHeightElement->LinkEndChild(heightContent);	// 给三级节点height添加文本
	TiXmlElement* pDepthElement = new TiXmlElement("depth");
	pSizeElement->LinkEndChild(pDepthElement);	// 连接到二级节点size节点下的三级节点
	TiXmlText* depthContent = new TiXmlText("3");		// depth节点文本
	pDepthElement->LinkEndChild(depthContent);	// 给三级节点depth添加文本

	///		保存到文件	
	pWriteDoc->SaveFile(filename.c_str());
	printf("new xml success, file's name is %s\n\n", filename.c_str());
	return 0;
}

读文件 

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

int main()
{
	// 新建的xml文件名字
	string filename = "E:/api/tinyxml/temp/yolo.xml";

	//从文件中读取
	// 定义一个TiXmlDocument类指针
	TiXmlDocument* pReadDocument = new TiXmlDocument();

	// 读取文件
	if (!pReadDocument->LoadFile(filename.c_str()))
	{
		printf("Could not load example xml file %s. Error='%s'\n", filename.c_str(), pReadDocument->ErrorDesc());
		return 0;
	}

	printf("read xml file success, file' name is %s \n\n", filename.c_str());

	//读取文档声明信息(第一个子节点转换得到文档声明)
	TiXmlDeclaration* pDeclar = pReadDocument->FirstChild()->ToDeclaration();
	if (pDeclar != NULL)
	{
		printf("read declare, version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
	}

	// 得到文件根节点
	TiXmlElement* pRootElement = new TiXmlElement("annotation");
	pRootElement = pReadDocument->RootElement();

	//遍历元素,打印
	printf("begin read all xml element \n\n");

	// 遍历所有的size
	// 函数FirstChildElement()		:	找到指定名字的元素
	// 函数NextSiblingElement		:	在同一级元素中查找下一个指定名字的元素
	int i = 0;
	for (TiXmlElement* pItem = pRootElement->FirstChildElement("size"); pItem; pItem = pItem->NextSiblingElement("size"))
	{
		printf("read the %d size \n", ++i);

		// 宽
		TiXmlElement* pWith = pItem->FirstChildElement("with");
		if (pWith != NULL)
		{
			printf("the %d size's with = %s \n", i, pWith->GetText());
		}
		// 高
		TiXmlElement* pHeight = pItem->FirstChildElement("height");
		if (pHeight != NULL)
		{
			printf("the %d size's height = %s \n", i, pHeight->GetText());
		}
		// 深度
		TiXmlElement* pDepth = pItem->FirstChildElement("depth");
		if (pDepth != NULL)
		{
			printf("the %d size's depth = %s \n", i, pDepth->GetText());
		}

		printf("\n\n");
	}
	return 0;
}

 删除节点编辑节点

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

int main()
{
	// 新建的xml文件名字
	string filename = "E:/api/tinyxml/temp/yolo.xml";

	//从文件中读取
	// 定义一个TiXmlDocument类指针
	TiXmlDocument* pReadDocument = new TiXmlDocument();

	// 读取文件
	if (!pReadDocument->LoadFile(filename.c_str()))
	{
		printf("Could not load yolo xml file %s. Error='%s'\n", filename.c_str(), pReadDocument->ErrorDesc());
		return 0;
	}

	printf("read xml file success, file' name is %s \n\n", filename.c_str());

	//读取文档声明信息(第一个子节点转换得到文档声明)
	TiXmlDeclaration* pDeclar = pReadDocument->FirstChild()->ToDeclaration();
	if (pDeclar != NULL)
	{
		printf("read declare, version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
	}

	// 得到文件根节点
	TiXmlElement* pRootElement = new TiXmlElement("annotation");
	pRootElement = pReadDocument->RootElement();

	//删除元素,属性
	TiXmlElement* pSize = pRootElement->FirstChildElement("size");
	if (pSize != NULL)
	{
		// 这里演示删除"depth"元素,删除其他节点也是一样的办法
		TiXmlElement* pDepth = pSize->FirstChildElement("depth");
		if (pDepth != NULL)
		{
			pSize->RemoveChild(pDepth);
		}

		// 这里演示修改"addr"元素
		TiXmlElement* pHeight = pSize->FirstChildElement("height");
		if (pHeight != NULL)
		{
			pHeight->SetValue("height"); //修改节点文本
			//pHeight->SetAttribute("name", "value");	// 修改属性值
		}

		//text文本是height的FirstChild,因此也可用SetValue函数:
		TiXmlNode* pText = pHeight->FirstChild();
		if (pText != NULL)
		{
			pText->SetValue("961");
		}
	}

	//	再次保存到文件	
	if (pReadDocument->SaveFile(filename.c_str()))
	{
		printf("save file success\n");
	}
	return 0;
}

 

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】

这篇关于windows系统下C++使用TinyXML读写XML文件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!