C++ XML 库 TinyXML2 的基本使用(案例版)

这篇具有很好参考价值的文章主要介绍了C++ XML 库 TinyXML2 的基本使用(案例版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TinyXML-2 是一个轻量级的开源 C++ XML 解析库,用于处理XML数据。

#include"pch.h"

#include <iostream>
#include <string>

#include "tinyxml2.h"

//tinyxml2的类在tinyxml2命名空间
using namespace tinyxml2;


int main()
{
	//0、创建对象
	tinyxml2::XMLDocument doc;
	//1、添加声明---XMLDeclaration*
	XMLDeclaration* declaration = doc.NewDeclaration();
	
	//2、创建根节点---XMLElement*
	XMLElement* root = doc.NewElement("Root"); doc.InsertEndChild(root);
	

	//3、创建子节点---XMLElement*
	 <User Name = "fengbingchun">
		<Blog>CSDN< / Blog>
		<Code>GitHub< / Code>
	 < / User>
	XMLElement* user = doc.NewElement("User");
	user->SetAttribute("Name", "feng");//user->Attribute("Name", "feng");
	root->InsertEndChild(user);

	XMLElement* blog = doc.NewElement("Blog");
	XMLText* text1 = doc.NewText("CSDN");
	blog->InsertEndChild(text1);
	user->InsertEndChild(blog);

	XMLElement* code = doc.NewElement("Code");
	XMLText* text2 = doc.NewText("GtiHub");
	code->InsertEndChild(text2);
	user->InsertEndChild(code);

	//<Blog Name = "CSDN">
	//	<Address>https://blog.csdn.net/fengbingchun</Address>
	//	<ID>fengbingchun< / ID>
	//< / Blog>

	XMLElement* blog2 = doc.NewElement("Blog");
	blog2->SetAttribute("Name", "CSDN");//blog2->Attribute("Name", "CSDN");
	root->InsertEndChild(blog2);	//设置结束标签: 大节点-》小节点 (父节点-》子节点)

	XMLElement* addr = doc.NewElement("Address");
	XMLText* text3 = doc.NewText("https://blog.csdn.net/fengbingchun");
	addr->InsertEndChild(text3);
	blog2->InsertEndChild(addr);		// 大节点-》小节点 (父节点-》子节点)

	XMLElement* ID = doc.NewElement("ID");
	XMLText* text4 = doc.NewText("feng");
	ID->InsertEndChild(text4);
	blog2->InsertEndChild(ID);

	//<Code Name = "GitHub">
	//	<Address>https://github.com//fengbingchun</Address>
	//	< Repositories>27 < / Repositories >
	//< / Code>
	XMLElement* code2 = doc.NewElement("Code");
	code2->SetAttribute("Name", "GitHub");
	root->InsertEndChild(code2);

	XMLElement* add2 = doc.NewElement("Address");
	XMLText* text5 = doc.NewText("https://github.com//fengbingchun");
	add2->InsertEndChild(text5);
	code2->InsertEndChild(add2);

	XMLElement* repositories = doc.NewElement("Repositories");
	repositories->InsertEndChild(doc.NewText("27"));
	code2->InsertEndChild(repositories);


	tinyxml2::XMLComment* comment = doc.NewComment("this is a xml test file");
	doc.InsertEndChild(comment);
	//4、子节点添加属性、内容


	//5、保存XML文件
	XMLError result = doc.SaveFile("713.xml");//doc.SaveFile("1.xml");
	if (result == XML_SUCCESS) printf("XML文件保存成功!\n");
	else printf("XML文件保存失败!\n");
}


<Root>
    <User Name="feng">
        <Blog>CSDN</Blog>
        <Code>GtiHub</Code>
    </User>
    <Blog Name="CSDN">
        <Address>https://blog.csdn.net/fengbingchun</Address>
        <ID>feng</ID>
    </Blog>
    <Code Name="GitHub">
        <Address>https://github.com//fengbingchun</Address>
        <Repositories>27</Repositories>
    </Code>
</Root>

<!--this is a xml test file-->

解析XML

<?xml version="1.0" encoding="utf-8"?>
<PCBADiag>
	<SYSTEMINFO0 SYSID="870E103C" LOG="TRUE"LOGPATH="D:\BIGDATA\LOG\">
		<FWCPU>
			<TESTITEM ITEM="CPU0" LOCATION="CPU" CAPTION="CPU TEST" DEVICE="CPU" VALUE="CPU0" ERRORCODE="EF520" TEST="TRUE">
				<CONFIG NAME="CPU0"	MODEL="AMD64 Family 25 Model 80 Stepping 0" CPUID="178BFBFF00A50F00" CORES="6" L1Cache="384KB" 	L2Cache="3072KB" L3Cache="16384KB" MANUFACTURER="AuthenticAMD" MAINFREQUENCY="3800MHZ"/>
			</TESTITEM>
	
		</FWCPU>
	</SYSTEMINFO0>
</PCBADiag>
#include <iostream>
#include <string>

#include "tinyxml2.h"

int getXML(System_Info* system_info, Config* config) {
	char SystemInfo[128];	//TCHAR SystemInfo[128];
	char SystemID[128];			//用于存主板SSID.
	char keyValue[128];

	int i = 0;		//用于遍历XML项目数量,并存放测试总数量
	tinyxml2::XMLDocument doc;

	//未获取到主板SSID
	if (!GetSSID(SystemID)) {
		red("Get SYSID failed!\n");
		return 1;
	}
	//本地XML文件读取
	tinyxml2::XMLError ret = doc.LoadFile("DiagConfig.XML");
	if (ret == XML_SUCCESS) {
		//根节点  <PCBADiag></PCBADiag>	 ***************************  XML必须配置<PCBADiag>  *****************************
		XMLElement* elmtRoot = doc.RootElement();		
		for (int sysinfo_number = 0; sysinfo_number < 1024; sysinfo_number++) {
			sprintf_s(SystemInfo, "SYSTEMINFO%d", sysinfo_number);
			//wsprintf(SystemInfo, "SYSTEMINFO%d", sysinfo_number);
			//指定子节点
			XMLElement* elmtSystemInfo = elmtRoot->FirstChildElement(SystemInfo);
			if (elmtSystemInfo) {
				//printf("进入子节点elmtSystemInfo!!\n");
				//获取sysid属性
				sprintf_s(keyValue, "%s", elmtSystemInfo->Attribute("SYSID"));
				//比对SYSID
				if (!_stricmp(keyValue, SystemID)) {
					XMLElement* elmtCPU = elmtSystemInfo->FirstChildElement("FWCPU");
					if (elmtCPU) {
				
						sprintf_s(system_info->SysID, "%s", elmtSystemInfo->Attribute("SysID"));//保存SYSID的值
						
						sprintf_s(system_info->LOG, "%s", elmtSystemInfo->Attribute("LOG"));//保存Log生成判断的值
						
						sprintf_s(system_info->PATH, "%s\\FWCPU.log", elmtSystemInfo->Attribute("LOGPATH"));//保存LOG PATH的值

						for (XMLElement* elmtUNIT = elmtCPU->FirstChildElement(); elmtUNIT; elmtUNIT = elmtUNIT->NextSiblingElement()) {
							if (elmtUNIT) {
								//printf("进入子节点elmtUNIT\n");
								//保存ITEM
								wsprintf(keyValue, "%s", elmtUNIT->Attribute("ITEM"));
								if (keyValue[0] != NULL)
									sprintf_s(config[i].ITEM, "%s", keyValue);

								//printf("\n\nXML_ITEM%s\n\n", keyValue);

								//保存TEST----true
								wsprintf(keyValue, "%s", elmtUNIT->Attribute("TEST"));
								if (keyValue[0] != NULL)
									sprintf_s(config[i].TEST, "%s", keyValue);
								//保存ERRORCODE
								wsprintf(keyValue, "%s", elmtUNIT->Attribute("ERRORCODE"));
								if (keyValue[0] != NULL)
									sprintf_s(config[i].ERRORCODE, "%s", keyValue);
								//保存VALUE
								wsprintf(keyValue, "%s", elmtUNIT->Attribute("VALUE"));
								if (keyValue[0] != NULL)
									sprintf_s(config[i].VALUE, "%s", keyValue);
								//printf("XML_VALUE %s\n", keyValue);

								XMLElement* elmtConfig = elmtUNIT->FirstChildElement("CONFIG");
								if (elmtConfig) {
									//printf("进入子节点elmtConfig!666!\n");
									//--------------------  获取XML需要配置的信息,作比对  --------------------
									wsprintf(keyValue, "%s", elmtConfig->Attribute("NAME"));
									if (keyValue[0] != NULL)
									{
										sprintf_s(config[i].NAME, "%s", keyValue);
									}
									
									wsprintf(keyValue, "%s", elmtConfig->Attribute("MODEL"));
									if (keyValue[0] != NULL)
										sprintf_s(config[i].MODEL, "%s", keyValue);

									wsprintf(keyValue, "%s", elmtConfig->Attribute("CPUID"));
									if (keyValue[0] != NULL)
										sprintf_s(config[i].CPUID, "%s", keyValue);

									wsprintf(keyValue, "%s", elmtConfig->Attribute("CORES"));
									if (keyValue[0] != NULL)
										sprintf_s(config[i].CORES, "%s", keyValue);

									wsprintf(keyValue, "%s", elmtConfig->Attribute("L1Cache"));
									if (keyValue[0] != NULL)
										sprintf_s(config[i].L1CACHE, "%s", keyValue);


									wsprintf(keyValue, "%s", elmtConfig->Attribute("L2Cache"));
									if (keyValue[0] != NULL)
										sprintf_s(config[i].L2CACHE, "%s", keyValue);


									wsprintf(keyValue, "%s", elmtConfig->Attribute("L3Cache"));
									if (keyValue[0] != NULL)
										sprintf_s(config[i].L3CACHE, "%s", keyValue);


									wsprintf(keyValue, "%s", elmtConfig->Attribute("MANUFACTURER"));
									if (keyValue[0] != NULL)
										sprintf_s(config[i].MANUFACTURER, "%s", keyValue);

									wsprintf(keyValue, "%s", elmtConfig->Attribute("MAINFREQUENCY"));
									if (keyValue[0] != NULL)
										sprintf_s(config[i].MAINFREQUENCY, "%s", keyValue);
									//获取XML文件中CPU测试数量
									i++;

								}

							}
						}

					}
					else {
						
						red("Get CPU config failed!\n");
						return 1;
					}
					//保存XML文件中SATA数量
					system_info->Amount = i;
					return 0;
				}

			}
			else {
				
				cout << "SYSID:" << SystemID << endl;//DEBUG SYSID
				printf("Platform not supported!\n");
				return 1;
			}

		}
	}
	else if (ret == XML_ERROR_FILE_NOT_FOUND) {
		printf("XML file not exist!\n");
		return 1;
	}
	else {
		printf("XML file formal error!\n");
		return 1;
	}
}

【总结:】
1、导入 TinyXML-2 头文件:

#include <tinyxml2.h>
using namespace tinyxml2;

2、创建一个 XMLDocument 对象,用于加载和解析 XML 文件:

tinyxml2::XMLDocument xmlDoc;

3、使用 LoadFile 方法加载 XML 文件:

tinyxml2::XMLError result = xmlDoc.LoadFile("1.xml");

4、检查加载结果以确保 XML 文件成功加载:

if (result == XML_SUCCESS) {
    // XML 文件加载成功
} 	
else if (ret = = XML_ERROR_FILE_NOT_FOUND) {
		printf("XML 文件加载失败!\n");
		return 1;
	}
else {
		printf("XML 内容格式错误!\n");
		return 1;
	}

5、获取根节点:

tinyxml2::XMLNode* rootNode = xmlDoc.FirstChildElement("Root");

6、遍历子节点或获取特定子节点的属性或文本内容:

// 遍历所有子节点
for (tinyxml2::XMLElement* child = rootNode->FirstChildElement(); child != nullptr; child = child->NextSiblingElement()) {
    // 子节点处理逻辑
}

// 获取特定子节点的属性
const char* attributeValue = rootNode->FirstChildElement("Child")->Attribute("attributeName");

// 获取特定子节点的文本内容
const char* textValue = rootNode->FirstChildElement("Child")->GetText();

生成XML

#include <iostream>
#include <string>

#include "tinyxml2.h"

//tinyxml2的类在tinyxml2命名空间
using namespace tinyxml2;

int main()
{
	//1、创建XML文档对象
	tinyxml2::XMLDocument doc;	//XMLDocument doc;
	//2、创建根节点
	XMLNode* rootNode = doc.NewElement("Root");
	doc.InsertEndChild(rootNode);		// <Root>...</Root>
	//3、创建子节点并添加到根节点下
	XMLElement* childElement = doc.NewElement("Child");
	childElement->SetText("Hello World");
	rootNode->InsertEndChild(childElement);
	//4、保存XML文件
	XMLError result = doc.SaveFile("1.xml");

	if (result==XML_SUCCESS)
	{
		printf("XML文件保存成功!\n");
	}
	else
	{
		printf("XML文件保存失败。\n");
	}
	return 0;
}

展示效果:文章来源地址https://www.toymoban.com/news/detail-568975.html

<?xml version="1.0"?>
<Root>
    <Child>Hello World</Child>
</Root>

到了这里,关于C++ XML 库 TinyXML2 的基本使用(案例版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ajax-1--XML、AJAX简介、express框架使用、AJAX操作的基本步骤

    一、XML(可扩展标记语言) XML与HTML类似,不同的是HTML中 都是 预定义标签,而XML中 没有 预定义标签,全都是自定义标签,用来表示一些数据。 比如有一个学生数据:name=“孙悟空”;age=18;gender=“男”; 用XML表示: student name 孙悟空 /name age 18 /age gender 男 /gender /student XML被设

    2024年02月08日
    浏览(52)
  • Unity XML1——XML基本语法

    一、XML 概述 ​ 全称:可拓展标记语言(EXtensible Markup Language) ​ XML 是国际通用的,它是被设计来用于传输和存储数据的一种文本特殊格式,文件后缀一般为 .xml ​ 我们在游戏中可以把游戏数据按照 XML 的格式标准存储在 XML 文档中,再将 XML 文档存储在硬盘上或者传输给远

    2024年02月09日
    浏览(51)
  • 文件导入以及在线编辑-xml案例

        在线编辑器 参考 http://t.csdn.cn/uSgnf   在components下创建一个文件 叫 editor 然后 在下面创建一个js文件 叫 data_format_utils data_format_utils.js 参考代码如下 用来格式化 vkBeautify - javascript plugin 然后在 editor目录下创建一个组件 我这里叫 index.vue 参考代码如下 然后在main.js全局引入

    2024年02月13日
    浏览(41)
  • [Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例

    下面的案例中只是做一个简单的了解,不做深入理解啦 目录 一.使用Logback写日志 二.类加载器 三.XML 四.XML编写规定:DTD与schema 五.XML解析 六.XPath 七.单元测试 七.Assert(断言):检验方法结果 八.使用before与after注解备份与还原数据 九.注解 十.自定义注解 十一.注解案例:用注

    2024年02月04日
    浏览(55)
  • Spring注解驱动开发之常用注解案例_告别在XML中配置Bean

    注解驱动开发就是不再使用Spring的bean.xml文件,改为纯使用注解的方式开发 @Configuration 此注解为配置类注解,相当于spring.xml文件,即配置类==配置文件 @Bean 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id 示例 Person类(后续注解配置类中都会以此类举例),

    2024年01月21日
    浏览(49)
  • python 之xml 使用原生xml.dom

    一、xml操作 使用xml进行创建 二、获取值、修改值 直接获取数据 通过父节点定义子节点 并获取值 重新赋值 添加子节点 三、将一个xml文档,插入另一文档中(将一个节点值插入另一个节点) 将一个xml文档某个元素插入另一个文档,插入另一文档中 将另个文档中的节点,插入指

    2024年02月07日
    浏览(38)
  • maven本地仓库地址修改+maven国内镜像设置+maven运行所需pos.xml文件配置基本写法

    1,maven本地仓库地址修改 maven在使用过程中,本地项目仓库其空间占用会越来越大,但是其默认仓库位置往往是以C盘为主,C盘作为系统盘常常会遇到所在盘空间占满的情况,所以我们将其改至其他硬盘空间位置为适合做法,我们先进入以下位置; 我们可以在记事本中打开其

    2024年02月15日
    浏览(49)
  • JAXB 使用记录 bean转xml xml转bean 数组 继承 CDATA(转义问题)

    部分内容引自 https://blog.csdn.net/gengzhy/article/details/127564536 JAXBContext类 :是应用的入口,用于管理XML/Java绑定信息 Marshaller接口 :将Java对象序列化为XML数据 Unmarshaller接口 :将XML数据反序列化为Java对象 @XmlRootElement :将Java类或枚举类型映射到XML元素,用在Java类上,用于标注该类

    2024年02月07日
    浏览(47)
  • 使用DocumentBuilderFactory解析XML浅谈

    当使用Java解析XML时,可以使用 javax.xml.parsers.DocumentBuilderFactory 类。这个类提供了一种创建解析XML的文档对象的方式。 DocumentBuilderFactory 是一个抽 象类,提供了创建解析XML文档的工厂。它定义了一些用于配置和创建 DocumentBuilder 对象的方法,例如设置是否验证XML文档、设置是否

    2024年02月05日
    浏览(41)
  • xml中in的使用

    目录 一、简介  二、使用 1、参数为list 2、参数为Array 3、参数为Map 4、参数为对象(集合在对象中) XML中大于、小于、不等于符号使用 在xml中使用in查询需要使用foreach标签 foreach的属性: item:表示集合中每一个元素进行迭代的别名。 collection:为参数类型。 index:指定的名

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包