TinyXML2库的简单使用
1.创建XML
//xml头部声明
const char* declaration ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
//XML文档对象
XMLDocument doc;
//插入头部声明,会覆盖xml所有内容
doc.Parse(declaration);
//下面方法也能插入头部声明,但是不会覆盖
XMLDeclaration* declaration=doc.NewDeclaration();
doc.InsertFirstChild(declaration);
//创建一个节点--根节点
XMLElement* root=doc.NewElement("config");
//将根节点插入xml文档
doc.InsertEndChild(root);
//创建并保存到指定路径
doc.SaveFile(xmlPath);
//读取一个存在的xml
doc.LoadFile(xmlPath);
//创建一个节点对象User
XMLElement *userNode = doc.NewElement("User");
//给生成的节点对象添加属性
userNode->SetAttribute("Name", user.userName.c_str());
//把User节点插入到root节点下
root->InsertEndChild(userNode);
//创建一个Gender节点
XMLElement* gender = doc.NewElement("Gender");
//创建一个Text文本对象genderText
XMLText* genderText=doc.NewText(itoa(user.gender));
//将文本对象加入到Gender节点下
gender->InsertEndChild(genderText);
//把Gender节点插入到userNode节点下
userNode->InsertEndChild(gender);
//保存节点到文件中
doc.SaveFile(xmlPath);
//修改userNode节点下的Password属性为user->password.c_str()
userNode->SetAttribute("Password",user->password.c_str());
//修改mobileNode节点的内容为user->mobile.c_str()
mobileNode->SetText(user->mobile.c_str());
2.读取XML
//获取文档对象的根节点
XMLElement* root=doc.RootElement();
//获取到root节点的子节点User
XMLElement* userNode=root->FirstChildElement("User");
//获取到子节点的Name属性
userNode->Attribute("Name");
//获取下一个兄弟节点
userNode=userNode->NextSiblingElement();
//获取userNode节点下名为Gender的子节点
XMLElement* genderNode=userNode->FirstChildElement("Gender");
//获取genderNode节点的文本内容
genderNode->GetText();
//将xml打印至控制台
doc.Print();
//将XML输出至内存
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();
}
//读取根节点
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;
//读取根节点的子节点
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();
}
//读取字符串类型节点
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;
}
//读取字符串类型节点
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值类型节点
int ReadXMLIntNode(tinyxml2::XMLElement* node,int & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->IntText();
return tinyxml2::XML_SUCCESS;
}
//读取double值类型节点
int ReadXMLDoubleNode(tinyxml2::XMLElement* node,double & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->DoubleText();
return tinyxml2::XML_SUCCESS;
}
//读取浮点值类型节点
int ReadXMLFloatNode(tinyxml2::XMLElement* node,float & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->FloatText();
return tinyxml2::XML_SUCCESS;
}
//读取longlong类行值节点
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类行值节点
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值节点
int ReadXMLBoolNode(tinyxml2::XMLElement* node,bool & dst)
{
if(nullptr == node)
{
return tinyxml2::XML_NO_TEXT_NODE;
}
dst = node->BoolText();
return tinyxml2::XML_SUCCESS;
}
//读取short值节点
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;
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。