C++ 利用TinyXML解析接口文件

将下载软件包内的tinyxml2.h和tinyxml2.cpp文件加载到项目即可使用,代码如下:

#include
#include"tinyxml2.h"   //添加头文件
#include
#include
using namespace tinyxml2;
using namespace std;

//GBK转换为UTF-8格式
char* GBK2UTF(const char* gb2312)
{
	int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len + 1];
	memset(wstr, 0, len + 1);
	MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
	len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	char* str = new char[len + 1];
	memset(str, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
	if (wstr) delete[] wstr;
	return str;

}

void WriteXml()
{
	//创建XML文件,并保存

	//添加声明,xml声明包含了版本和编码格式
	tinyxml2::XMLDocument doc;

	XMLDeclaration * declaration = doc.NewDeclaration();
	doc.InsertFirstChild(declaration);

	//创建根节点   采集设备传感器
	XMLElement* root = doc.NewElement(GBK2UTF("采集设备传感器"));
	doc.InsertEndChild(root);

	//创建第一个一级子节点    启动采集任务
	XMLElement* childNodeStart = doc.NewElement(GBK2UTF("启动采集任务"));
	//创建两个二级子节点   
	XMLElement* childNodeTaskInfo1 = doc.NewElement(GBK2UTF("任务信息"));   //属于上面
	XMLElement* childNodeTaskPara1 = doc.NewElement(GBK2UTF("任务参数"));   //属于上面

	
	XMLText* content2 = doc.NewText(GBK2UTF("后续定义"));
	childNodeTaskPara1->InsertFirstChild(content2);

	//为任务信息节点增加属性
	childNodeTaskInfo1->SetAttribute(GBK2UTF("任务编号"), GBK2UTF("RW0000001"));
	childNodeTaskInfo1->SetAttribute(GBK2UTF("任务名称"), GBK2UTF("温度"));
	childNodeTaskInfo1->SetAttribute(GBK2UTF("工作方式"), GBK2UTF("连续查询"));
	childNodeTaskInfo1->SetAttribute(GBK2UTF("操作员"), GBK2UTF("张三"));

	root->InsertEndChild(childNodeStart);//启动采集任务  是  采集设备  的子节点
	childNodeStart->InsertEndChild(childNodeTaskInfo1);//任务信息  是  启动采集任务  的子节点
	childNodeStart->InsertEndChild(childNodeTaskPara1);//任务信息  是  启动采集任务  的子节点

	//创建第二个一级子节点      查询采集信息
	XMLElement* childNodeQuery = doc.NewElement(GBK2UTF("查询采集信息"));
	//创建两个二级子节点   
	XMLElement* childNodeTaskInfo2 = doc.NewElement(GBK2UTF("任务信息"));   //属于上面
	XMLElement* childNodeTaskPara2 = doc.NewElement(GBK2UTF("任务参数"));   //属于上面


	//为任务信息节点增加属性
	childNodeTaskInfo2->SetAttribute(GBK2UTF("任务编号"), GBK2UTF("RW0000002"));
	childNodeTaskInfo2->SetAttribute(GBK2UTF("任务名称"), GBK2UTF("湿度"));
	childNodeTaskInfo2->SetAttribute(GBK2UTF("工作方式"), GBK2UTF("定时查询"));
	childNodeTaskInfo2->SetAttribute(GBK2UTF("操作员"), GBK2UTF("李四"));

	childNodeTaskPara2->SetAttribute(GBK2UTF("参数1"), GBK2UTF("敏感性"));
	childNodeTaskPara2->SetAttribute(GBK2UTF("参数2"), GBK2UTF("稳定性"));
	

	root->InsertEndChild(childNodeQuery);//查询采集信息  是   采集设备  的子节点
	childNodeQuery->InsertEndChild(childNodeTaskInfo2);//任务信息  是  启动采集任务  的子节点
	childNodeQuery->InsertEndChild(childNodeTaskPara2);//任务信息  是  启动采集任务  的子节点



	//创建第三个一级子节点      停止采集任务
	XMLElement* childNodeEnd = doc.NewElement(GBK2UTF("停止采集任务"));
	//创建两个二级子节点   
	XMLElement* childNodeTaskInfo3 = doc.NewElement(GBK2UTF("任务信息"));   //属于上面
	XMLElement* childNodeTaskPara3 = doc.NewElement(GBK2UTF("任务参数"));   //属于上面
	
	XMLText* content5 = doc.NewText(GBK2UTF("3333"));
	childNodeTaskInfo3->InsertFirstChild(content5);
	XMLText* content6 = doc.NewText(GBK2UTF("4444"));
	childNodeTaskPara3->InsertFirstChild(content6);

	//为任务信息节点增加属性
	childNodeTaskInfo3->SetAttribute(GBK2UTF("任务编号"), GBK2UTF("RW0000003"));
	childNodeTaskInfo3->SetAttribute(GBK2UTF("任务名称"), GBK2UTF("速度"));
	childNodeTaskInfo3->SetAttribute(GBK2UTF("工作方式"), GBK2UTF("定时查询"));
	childNodeTaskInfo3->SetAttribute(GBK2UTF("操作员"), GBK2UTF("王五"));


	root->InsertEndChild(childNodeEnd);//
	childNodeEnd->InsertEndChild(childNodeTaskInfo3);//任务信息  是  启动采集任务  的子节点
	childNodeEnd->InsertEndChild(childNodeTaskPara3);//任务信息  是  启动采集任务  的子节点


	//保存XML文件
	doc.SaveFile("taskInfo.xml");   //不能利用GBK2UTF()函数转换

}


int main()
{

	WriteXml();

	cout << "保存成功!" << endl;
	getchar();
	return 0;
}

创建的xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<采集设备传感器>
    <启动采集任务>
        <任务信息 任务编号="RW0000001" 任务名称="温度" 工作方式="连续查询" 操作员="张三"/>
        <任务参数>后续定义</任务参数>
    </启动采集任务>
    <查询采集信息>
        <任务信息 任务编号="RW0000002" 任务名称="湿度" 工作方式="定时查询" 操作员="李四"/>
        <任务参数 参数1="敏感性" 参数2="稳定性"/>
    </查询采集信息>
    <停止采集任务>
        <任务信息 任务编号="RW0000003" 任务名称="速度" 工作方式="定时查询" 操作员="王五">3333</任务信息>
        <任务参数>4444</任务参数>
    </停止采集任务>
</采集设备传感器>

你可能感兴趣的:(C++)