将下载软件包内的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</任务参数>
</停止采集任务>
</采集设备传感器>