2022-08-09 tinyxml2的简单使用

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辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容