C++实现对XML文件的读写操作

一、预先准备

  • 操作系统:win10(unix也可按照此操作)
  • 编译器:gcc/g++
  • 软件编辑器:Visual Studio Code
  • 依赖文件:tinyXml

注意:读者需事先安装配置gcc/g++,具体细节可参考https://jingyan.baidu.com/article/ab0b563085d2a8c15afa7da4.html

二、使用方法

新建项目文件夹(例如:test),将下载好的tinyXml解压,解压后将下图中的6个文件复制到项目文件夹中。
图一
使用vscode打开项目文件夹,新建test.cpp文件,并将下面的代码粘贴至test.cpp文件中。项目文件下载链接:https://github.com/hlc0216/xml_wr
在这里插入图片描述

#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#include "tinyxml.h"
#include <iostream>
#include <cstring>
using namespace std;
 
/*
	TiXmlDocument:文档类,它代表了整个xml文件
	TiXmlDeclaration:声明类,它表示文件的声明部分
	TiXmlComment:注释类,它表示文件的注释部分
	TiXmlElement:元素类,它是文件的主要部分,并且支持嵌套结构,一般使用这种结构来分类的存储信息,它可以包含属性类和文本类
	TiXmlAttribute/TiXmlAttributeSet:元素属性,它一般嵌套在元素中,用于记录此元素的一些属性
	TiXmlText:文本对象,它嵌套在某个元素内部
*/
//创建xml文件
int writeXmlFile()
{
	TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针
	
	//文档格式声明
	TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
	writeDoc->LinkEndChild(decl); //写入文档
 
	int n = 3;	//父节点个数
 
	TiXmlElement *RootElement = new TiXmlElement("Info");//根元素
	RootElement->SetAttribute("num", n); //属性
	writeDoc->LinkEndChild(RootElement);
	
	for(int i=0; i<n; i++)//n个父节点
	{
		TiXmlElement *StuElement = new TiXmlElement("Stu");//Stu
		//设置属性
		StuElement->SetAttribute("class","A");
		if(2 == i)
		{
				StuElement->SetAttribute("class","B");
		}
		
		StuElement->SetAttribute("id",i+1);
		StuElement->SetAttribute("flag", (i+1)*10);
		RootElement->LinkEndChild(StuElement);//父节点写入文档
	
		//姓名
		TiXmlElement *nameElement = new TiXmlElement("name");
		StuElement->LinkEndChild(nameElement);
 
		TiXmlText *nameContent = new TiXmlText("mike");
		nameElement->LinkEndChild(nameContent);
		
		//分数
		TiXmlElement *scoreElement = new TiXmlElement("score");
		StuElement->LinkEndChild(scoreElement);
 
		TiXmlText *scoreContent = new TiXmlText("88");
		scoreElement->LinkEndChild(scoreContent);
		
		//城市
		TiXmlElement *cityElement = new TiXmlElement("city");
		StuElement->LinkEndChild(cityElement);
 
		TiXmlText *cityContent = new TiXmlText("Shenzhen");
		cityElement->LinkEndChild(cityContent);
		
	}
	
	writeDoc->SaveFile("stu_info.xml");
	delete writeDoc;
	
	return 1;
}
 
//解析xml文件
int readXmlFile()
{
	TiXmlDocument mydoc("stu_info.xml");//xml文档对象
	bool loadOk=mydoc.LoadFile();//加载文档
	if(!loadOk)
	{
		cout<<"could not load the test file.Error:"<<mydoc.ErrorDesc()<<endl;
		exit(1);
	}
 
	TiXmlElement *RootElement=mydoc.RootElement();	//根元素, Info
	cout<< "[root name]" << RootElement->Value() <<"\n";
	
	TiXmlElement *pEle=RootElement;
 
	//遍历该结点
	for(TiXmlElement *StuElement = pEle->FirstChildElement();//第一个子元素
		StuElement != NULL;
		StuElement = StuElement->NextSiblingElement())//下一个兄弟元素
	{
		// StuElement->Value() 节点名称
		cout<< StuElement->Value() <<" ";
		TiXmlAttribute *pAttr=StuElement->FirstAttribute();//第一个属性
		
		while( NULL != pAttr) //输出所有属性
		{
			cout<<pAttr->Name()<<":"<<pAttr->Value()<<" ";
			pAttr=pAttr->Next();
		}
		cout<<endl;
		
		//输出子元素的值
		for(TiXmlElement *sonElement=StuElement->FirstChildElement();
		sonElement;
		sonElement=sonElement->NextSiblingElement())
		{
			cout<<sonElement->FirstChild()->Value()<<endl;
		}
	}
	
	return 1;
}
 
int main(int argc, char *argv[])
{
	
	writeXmlFile();
	printf("\nafter write\n");
	readXmlFile();
	return 0;
}

三、编译运行

单击test.cpp,右键选择在终端中打开,输入g++ *.cpp,或者gcc *.cpp后会生成a.exe,再输入./a,终端就会有输出结果。
在这里插入图片描述

  • 6
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 可以使用libxml2库来读写xml文件,以下是一个简单的示例代码: #include <stdio.h> #include <libxml/parser.h> #include <libxml/tree.h> int main() { xmlDocPtr doc; xmlNodePtr root, node; xmlChar *content; // 创建一个空的xml文档 doc = xmlNewDoc(BAD_CAST "1."); root = xmlNewNode(NULL, BAD_CAST "root"); xmlDocSetRootElement(doc, root); // 添加一个子节点 node = xmlNewChild(root, NULL, BAD_CAST "node", BAD_CAST "Hello World!"); // 保存xml文档到文件 xmlSaveFormatFileEnc("test.xml", doc, "UTF-8", 1); // 读取xml文件 doc = xmlReadFile("test.xml", NULL, ); root = xmlDocGetRootElement(doc); // 遍历子节点并输出内容 for (node = root->children; node != NULL; node = node->next) { content = xmlNodeGetContent(node); printf("%s\n", content); xmlFree(content); } // 释放资源 xmlFreeDoc(doc); xmlCleanupParser(); return ; } ### 回答2: C语言中没有内置的库函数可以直接读写XML文件,但可以通过第三方库来实现。以下是使用libxml2库来读写XML文件的简单代码示例: ```c #include <stdio.h> #include <libxml/parser.h> #include <libxml/tree.h> void writeXML(const char* filename) { xmlDocPtr doc = NULL; xmlNodePtr root = NULL; xmlNodePtr node = NULL; // 创建一个XML文档以及根节点 doc = xmlNewDoc(BAD_CAST "1.0"); root = xmlNewNode(NULL, BAD_CAST "root"); xmlDocSetRootElement(doc, root); // 创建一个子节点并设置文本内容 node = xmlNewTextChild(root, NULL, BAD_CAST "name", BAD_CAST "John"); // 将XML文档写入文件 xmlSaveFormatFileEnc(filename, doc, "UTF-8", 1); // 释放资源 xmlFreeDoc(doc); xmlCleanupParser(); } void readXML(const char* filename) { xmlDocPtr doc = NULL; xmlNodePtr root = NULL; xmlNodePtr node = NULL; // 解析XML文件 doc = xmlParseFile(filename); if (doc == NULL) { fprintf(stderr, "Failed to parse XML file\n"); return; } // 获取根节点 root = xmlDocGetRootElement(doc); // 遍历子节点并打印文本内容 for (node = root->children; node; node = node->next) { if (node->type == XML_ELEMENT_NODE) { printf("%s: %s\n", node->name, xmlNodeGetContent(node)); } } // 释放资源 xmlFreeDoc(doc); xmlCleanupParser(); } int main() { const char* filename = "sample.xml"; writeXML(filename); readXML(filename); return 0; } ``` 这段代码定义了两个函数:writeXML和readXML,分别用于写入和读取XML文件。在函数main中,先调用writeXML函数创建一个sample.xml文件,然后再调用readXML函数读取该文件并打印出节点名称和文本内容。 注意:在使用此代码之前,确保已经安装了libxml2库,并在编译时链接该库。 ### 回答3: 下面是一个简单的例子,展示了如何使用C语言读取和写入XML文件。 读取XML文件的代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libxml/xmlmemory.h> #include <libxml/parser.h> void parseXML(const char *filename) { xmlDocPtr doc; xmlNodePtr cur; doc = xmlParseFile(filename); if (doc == NULL) { fprintf(stderr, "无法打开文件\n"); return; } cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr, "空文件\n"); xmlFreeDoc(doc); return; } if (xmlStrcmp(cur->name, (const xmlChar *)"root")) { fprintf(stderr, "不正确的文件格式\n"); xmlFreeDoc(doc); return; } cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"node"))) { xmlChar *key; key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); printf("节点内容: %s\n", key); xmlFree(key); } cur = cur->next; } xmlFreeDoc(doc); return; } int main() { const char *filename = "example.xml"; parseXML(filename); return 0; } ``` 写入XML文件的代码如下: ```c #include <stdio.h> #include <libxml/parser.h> #include <libxml/tree.h> int main() { xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "root"); xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "node"); xmlDocSetRootElement(doc, root); xmlAddChild(root, node); xmlNodePtr content = xmlNewText(BAD_CAST "这是一个节点的内容"); xmlAddChild(node, content); xmlSaveFormatFileEnc("example.xml", doc, "UTF-8", 1); xmlFreeDoc(doc); xmlCleanupParser(); return 0; } ``` 上面的代码使用了libxml库来读取和写入XML文件。读取XML文件的代码首先打开并解析了XML文件,然后遍历每个节点并打印出节点的内容。 写入XML文件的代码创建了一个XML文档对象,并创建了根节点和一个子节点,然后将内容添加到子节点中,并将根节点设置为XML文档的根节点,最后将该文档保存到文件中。 这只是简单的XML读写操作的示例,实际项目中可能需要更复杂的操作和对XML结构的更深入理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸落寰宇

小编会不断努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值