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

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

#include"pch.h"#include 
#include #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* 	CSDN< / Blog>	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);////	
https://blog.csdn.net/fengbingchun
// 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);////
https://github.com//fengbingchun
// < 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\">" LOCATION="CPU" CAPTION="CPU TEST" DEVICE="CPU" VALUE="CPU0" ERRORCODE="EF520" TEST="TRUE">"	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 
#include #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;//未获取到主板SSIDif (!GetSSID(SystemID)) {red("Get SYSID failed!\n");return 1;}//本地XML文件读取tinyxml2::XMLError ret = doc.LoadFile("DiagConfig.XML");if (ret == XML_SUCCESS) {//根节点  	 ***************************  XML必须配置  *****************************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"));//比对SYSIDif (!_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");//保存ITEMwsprintf(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----truewsprintf(keyValue, "%s", elmtUNIT->Attribute("TEST"));if (keyValue[0] != NULL)sprintf_s(config[i].TEST, "%s", keyValue);//保存ERRORCODEwsprintf(keyValue, "%s", elmtUNIT->Attribute("ERRORCODE"));if (keyValue[0] != NULL)sprintf_s(config[i].ERRORCODE, "%s", keyValue);//保存VALUEwsprintf(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 SYSIDprintf("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 
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 
#include #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);		// ...//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;
}

展示效果:

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章