tinyxml2的使用说明
参考了这篇博客
tinyxml2安装
推荐使用vcpkg进行安装,关于vcpkg如何安装?
参考
https://docs.microsoft.com/zh-cn/cpp/build/install-vcpkg?view=msvc-160&tabs=macos#to-copy-and-set-up-vcpkg-on-windows
vcpkg如何使用?参考:
https://docs.microsoft.com/zh-cn/cpp/build/vcpkg-command-line-reference?view=msvc-160
tinyxml2库的基本说明
Element元素
每个元素都由两对尖括号围起来。格式如下
<元素名>这句话是当前元素的内容<\元素名>
整个xml文档一般都是元素套元素的结构,只有一个根元素,其他各元素都是根元素的子元素。
在tinyxml2中,XMLElement类的一个对象使用GetChildElement(param)
方法获取指向子元素的指针。不传递参数时,默认返回第一个子元素的指针;传递一字符串指针时,返回第一个元素名与该字符串内容匹配的子元素的指针。
Attribute属性
在一对尖括号内部,分别是一个元素的名称(Name),属性(Attribute)和值(Value)。属性可以为空。示例如下
<元素名 属性1="属性1的值" 属性2="属性2的值" 属性3="属性3的值">
常用方法介绍
GetText()
方法由XMLElement的对象调用,它获取的是当前元素内部除所有子元素之前的文本部分。例如下面的xml文档片段
<?xml version="1.0" encoding="UTF-8"?>
<root>
<TaskMsg>01015407
<!-- 项目名称 -->
<ProjectName/>
<!-- 任务编号 -->
<TaskMsgID>1000000001</TaskMsgID>
<!-- 任务名称 -->
<TaskMsgName>任务名称</TaskMsgName>
<!-- 目标生产系统 -->
<TaskMsgTo>SG</TaskMsgTo>
<!--任务创建时间 -->
<TaskCreateTime>2020-09-06 11:52:21</TaskCreateTime>
2333
</TaskMsg>
<Params>
<SubParam1>none</SubParam1>
<Params>
</root>
调用eleRoot->FirstChildElement("TaskMsg")->GetText()
返回的字符串为“01015407”;
例程
写xml文件
// 创建xml文件
#include<tinyxml2.h>
string filename="test.xml";
int main()
{
tinyxml2::XMLDocument docXml;
// 添加声明
tinyxml2::XMLDeclaration* declaration = docXml.NewDeclaration();
docXml.InsertFirstChild(declaration);
// 创建根节点
tinyxml2::XMLElement* e_root = docXml.NewElement("AdjustmentOptions");
docXml.InsertEndChild(e_root);
// 给根节点添加新的子节点
tinyxml2::XMLElement* e_AdjType = e_root->InsertNewChildElement("AdjustmentType");
e_AdjType->SetText(adj_flag);
tinyxml2::XMLElement* init_eo = e_root->InsertNewChildElement("InitialEOPFile");
init_eo->SetText(eoname.c_str());
tinyxml2::XMLElement* e_init_cam = e_root->InsertNewChildElement("InitialCameraFile");
e_init_cam->SetText(cmrname.c_str());
tinyxml2::XMLElement* e_max_iter = e_root->InsertNewChildElement("MaxIterNumber");
e_max_iter->SetText(max_iter);
tinyxml2::XMLElement* e_weightXYZ = e_root->InsertNewChildElement("WeightGPS");
e_weightXYZ->SetText(weightXYZ);
// 保存文件
docXml.SaveFile(opt_file.c_str());
return 0;
}
读xml文件
// 读取xml文件
#include<tinyxml2.h>
string filename="test.xml";
int main()
{
tinyxml2::XMLDocument expXml;
tinyxml2::XMLError err = expXml.LoadFile(filename.c_str());
if (tinyxml2::XML_SUCCESS == err)
{
tinyxml2::XMLElement* elmtRoot = expXml.RootElement();
tinyxml2::XMLElement* ID1 = elmtRoot->FirstChildElement("TaskMsg");
tinyxml2::XMLElement* ID2 = elmtRoot->FirstChildElement("InputParams");
tinyxml2::XMLElement* ID3 = elmtRoot->FirstChildElement("OutParams");
const tinyxml2::XMLElement* prjname =ID1->FirstChildElement("ProjectName")->NextSiblingElement(); //ID1->FirstAttribute();
const char* pTName = prjname->GetText();
const char* pTitle = prjname->Name();
pTitle = prjname->Value();
const tinyxml2::XMLAttribute* ID1_2 = ID2->FirstAttribute();
std::cout << ID1_2->Name() << ":" << ID1_2->Value() << std::endl;
const tinyxml2::XMLAttribute* ID1_2_1 = ID2->FirstAttribute()->Next();
std::cout << ID1_2_1->Name() << ":" << ID1_2_1->Value() << std::endl;
const tinyxml2::XMLAttribute* ID1_2_2 = ID2->FirstAttribute()->Next()->Next();
std::cout << ID1_2_2->Name() << ":" << ID1_2_2->Value() << std::endl;
const tinyxml2::XMLAttribute* ID1_3 = ID3->FirstAttribute();
std::cout << ID1_3->Name() << ":" << ID1_3->Value() << std::endl;
const tinyxml2::XMLAttribute* ID1_3_1 = ID3->FirstAttribute()->Next();
std::cout << ID1_3_1->Name() << ":" << ID1_3_1->Value() << std::endl;
const char* pContent1 = ID1->GetText();
std::cout << "TaskMsg: " << pContent1 << std::endl;
const char* pContent2 = ID2->GetText();
std::cout << "InputParams: " << pContent2 << std::endl;
const char* pContent3 = ID3->GetText();
std::cout << "OutParams: " << pContent3 << std::endl;
}