TinyXML2庫的簡單使用
1.創(chuàng)建XML
//xml頭部聲明
const char* declaration ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
//XML文檔對象
XMLDocument doc;
//插入頭部聲明,會覆蓋xml所有內(nèi)容
doc.Parse(declaration);
//下面方法也能插入頭部聲明泪喊,但是不會覆蓋
XMLDeclaration* declaration=doc.NewDeclaration();
doc.InsertFirstChild(declaration);
//創(chuàng)建一個節(jié)點--根節(jié)點
XMLElement* root=doc.NewElement("config");
//將根節(jié)點插入xml文檔
doc.InsertEndChild(root);
//創(chuàng)建并保存到指定路徑
doc.SaveFile(xmlPath);
//讀取一個存在的xml
doc.LoadFile(xmlPath);
//創(chuàng)建一個節(jié)點對象User
XMLElement *userNode = doc.NewElement("User");
//給生成的節(jié)點對象添加屬性
userNode->SetAttribute("Name", user.userName.c_str());
//把User節(jié)點插入到root節(jié)點下
root->InsertEndChild(userNode);
//創(chuàng)建一個Gender節(jié)點
XMLElement* gender = doc.NewElement("Gender");
//創(chuàng)建一個Text文本對象genderText
XMLText* genderText=doc.NewText(itoa(user.gender));
//將文本對象加入到Gender節(jié)點下
gender->InsertEndChild(genderText);
//把Gender節(jié)點插入到userNode節(jié)點下
userNode->InsertEndChild(gender);
//保存節(jié)點到文件中
doc.SaveFile(xmlPath);
//修改userNode節(jié)點下的Password屬性為user->password.c_str()
userNode->SetAttribute("Password",user->password.c_str());
//修改mobileNode節(jié)點的內(nèi)容為user->mobile.c_str()
mobileNode->SetText(user->mobile.c_str());
2.讀取XML
//獲取文檔對象的根節(jié)點
XMLElement* root=doc.RootElement();
//獲取到root節(jié)點的子節(jié)點User
XMLElement* userNode=root->FirstChildElement("User");
//獲取到子節(jié)點的Name屬性
userNode->Attribute("Name");
//獲取下一個兄弟節(jié)點
userNode=userNode->NextSiblingElement();
//獲取userNode節(jié)點下名為Gender的子節(jié)點
XMLElement* genderNode=userNode->FirstChildElement("Gender");
//獲取genderNode節(jié)點的文本內(nèi)容
genderNode->GetText();
//將xml打印至控制臺
doc.Print();
//將XML輸出至內(nèi)存
XMLPrinter printer;
doc.Print( &printer );
使用
int ReadXML(const char* xmlPath)
{ //聲明XML文檔
tinyxml2::XMLDocument doc;
//加載文檔
int ret = doc.LoadFile(xmlPath);
if (ret != tinyxml2::XML_SUCCESS)
{
fprintf(stderr,"LoadFile failed");
return doc.ErrorID();
}
//讀取根節(jié)點
tinyxml2::XMLElement* root = doc.RootElement();
if(root == nullptr)
{
fprintf(stderr,"read root node failed");
return doc.ErrorID();
}
struct ServerAddr
{
int index;
std::string ip;
unsigned short port;
};
ServerAddr server_addr;
//讀取根節(jié)點的子節(jié)點
tinyxml2::XMLElement* server_addr_node = XMLNodeGetChildNode(root,"server_addr");
ret = ReadXMLIntNode(XMLNodeGetChildNode(server_addr_node,"Index"),server_addr.index);//讀取int
if(ret != 0)
{
//todo:錯誤處理+日志打印
}
ret = ReadXMLStringNode(XMLNodeGetChildNode(server_addr_node,"Ip"),server_addr.ip); //讀取string
if(ret!= 0)
{
//todo:錯誤處理+日志打印
}
ret = ReadXMLUShortNode(XMLNodeGetChildNode(server_addr_node,"Port"),server_addr.port); //讀取ushort
if(ret!= 0)
{
//todo:錯誤處理+日志打印
}
fprintf(stdout,"index =%d ,ip = %s ,port = %d\n",server_addr.index,server_addr.ip,server_addr.port);
doc.Print();
return doc.ErrorID();
}
//讀取字符串類型節(jié)點
int ReadXMLStringNode(tinyxml2::XMLElement* node,std::string& dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
const char* data = node->GetText();
dst = data;
return tinyxml2::XML_SUCCESS;
}
//讀取字符串類型節(jié)點
int ReadXMLStringNode(tinyxml2::XMLElement* node,char * dst,int size)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
const char* data = node->GetText();
assert(sizeof(data) <= size);
memcpy(dst,data,size);
return tinyxml2::XML_SUCCESS;
}
//讀取int值類型節(jié)點
int ReadXMLIntNode(tinyxml2::XMLElement* node,int & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->IntText();
return tinyxml2::XML_SUCCESS;
}
//讀取double值類型節(jié)點
int ReadXMLDoubleNode(tinyxml2::XMLElement* node,double & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->DoubleText();
return tinyxml2::XML_SUCCESS;
}
//讀取浮點值類型節(jié)點
int ReadXMLFloatNode(tinyxml2::XMLElement* node,float & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->FloatText();
return tinyxml2::XML_SUCCESS;
}
//讀取longlong類行值節(jié)點
int ReadXMLInt64Node(tinyxml2::XMLElement* node,long long & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->Int64Text();
return tinyxml2::XML_SUCCESS;
}
//讀取 unsigned long long類行值節(jié)點
int ReadXMLUInt64Node(tinyxml2::XMLElement* node,unsigned long long & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->Unsigned64Text();
return tinyxml2::XML_SUCCESS;
}
//讀取bool值節(jié)點
int ReadXMLBoolNode(tinyxml2::XMLElement* node,bool & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->BoolText();
return tinyxml2::XML_SUCCESS;
}
//讀取short值節(jié)點
int ReadXMLUShortNode(tinyxml2::XMLElement* node,unsigned short & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->UnsignedText();
return tinyxml2::XML_SUCCESS;
}
tinyxml2::XMLElement* XMLNodeGetChildNode(tinyxml2::XMLElement* father_node,const char* name,int *errornum)
{
if(father_node == nullptr)
{
*errornum = tinyxml2::XML_ERROR_FILE_READ_ERROR;
return nullptr;
}
return father_node->FirstChildElement(name);
*errornum = tinyxml2::XML_SUCCESS;
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者