配置文件的读取方面,以前是用最笨的方法,使用C语言按字符来读取,所以配置文件也很简单,就是一个文本文件,现在TinyXML2出来的,使得读取XML文件很轻松,所以也应该向这边去转变。
在使用TinyXML2之前,首先看一下XML文件的格式
//根节点
//第二层子节点
//第三层子节点,包含多个属性,以空格隔开
This is …
//第二层子节点
虽然我们的配置文件一次性设置好之后,基本上不需要经常修改,所以我们主要关注的是读取XML文件,但基本格式还是要清楚的
从上面来看,如果节点中没有描述,它的标识符只有一个,,如果节点中有属性,则在标识符后面直接添加属性,而当有节点描述,或还有子节点时,才会成对的出现。
#include "tinyxml2.h"
using namespace tinyxml2;
using namespace std;
void main()
{
//创建XML的DOM对象
XMLDocument doc;
//创建一个声明,并加到DOM对象中
XMLDeclaration* decl = doc.NewDeclaration();
doc.InsertFirstChild(decl);
//创建根节点
XMLElement * root = doc.NewElement("Root");
doc.LinkEndChild(root);
//创建子节点
XMLElement * Account = doc.NewElement("Account");
doc.LinkEndChild(Account);
XMLElement * Market = doc.NewElement("Market");
doc.LinkEndChild(Market);
//创建子节点
tinyxml2::XMLElement* UserID = doc.NewElement("UserID");
tinyxml2::XMLElement* BrokerID = doc.NewElement("BrokerID");
tinyxml2::XMLElement* Passwd = doc.NewElement("Passwd");
tinyxml2::XMLElement* IPAddr = doc.NewElement("IPAddr");
tinyxml2::XMLElement* AppID = doc.NewElement("AppID");
tinyxml2::XMLElement* AuthWord = doc.NewElement("AuthWord");
//为每个节点添加属性,可以添加多个属性
UserID->SetAttribute("UserID", "257...");
UserID->SetAttribute("UserName", "Griffin");
UserID->SetAttribute("UserType", "Futures Trader");
BrokerID->SetAttribute("BrokerID", "43");
Passwd->SetAttribute("Passwd", "5...");
IPAddr->SetAttribute("IPAddr", "tcp://18...");
AppID->SetAttribute("AppID", "clien0");
AuthWord->SetAttribute("AuthWord", "Z.............");
//每个节点添加描述内容,这部分可加可不加
tinyxml2::XMLText* AppIDdescript = doc.NewText("This is .....");
AppID->InsertFirstChild(AppIDdescript);
//设计节点树
//首先,最外一层是root,root下面有两层,分别为Account,Market
//然后UserID BrokerID等都在Account这一层下面
root->InsertEndChild(Account);
root->InsertEndChild(Market);
Account->InsertEndChild(UserID);
Account->InsertEndChild(BrokerID);
Account->InsertEndChild(Passwd);
Account->InsertEndChild(IPAddr);
Account->InsertEndChild(AppID);
Account->InsertEndChild(AuthWord);
//如果文件已存在,则会覆盖掉原来的内容
doc.SaveFile("Config.xml");
}
接下来就是读取XML文件了
//创建XML的DOM对象
XMLDocument xml;
if (XML_SUCCESS != xml.LoadFile("madeByHand2.xml"))
{
return;
}
读取根节点
tinyxml2::XMLElement* rootNode = xml.RootElement();
if (rootNode == NULL) {
return;
}
tinyxml2::XMLElement* Account = rootNode->FirstChildElement("Account");
//读取根节点的下的第一个节点
tinyxml2::XMLElement* UserID = Account->FirstChildElement("UserID");
//再获取节点中的属性
const XMLAttribute* user = UserID->FirstAttribute();
//获取属性中的值
string userId = user->Value();
cout << userId.c_str() << endl;
//如果一个节点有多个属性,则把指针往后移,指向下一个属性,再获取值
user = user->Next();
string userName = user->Value();
cout << userName.c_str() << endl;
//
读取同一级别的下一个节点
tinyxml2::XMLElement* BrokerID = UserID->NextSiblingElement("BrokerID");
const XMLAttribute* broker = BrokerID->FirstAttribute();
//获取属性中的值
string sbroker = broker->Value();
cout << sbroker.c_str() << endl;
由此,完成了配置文件的读写功能。