1. 程式人生 > >TinyXML2使用方法及示例

TinyXML2使用方法及示例

轉自https://blog.csdn.net/liang_baikai/article/details/78783839


概述
 TinyXML2是簡單實用的開源的C++XML檔案解析庫,可以很方便的應用到現有的專案之中。 
 TinyXML2解析器相對TinyXML1在程式碼上是完全重寫,使其更適合於遊戲開發中使用。它使用更少的記憶體,更快,並使用更少的記憶體分配。

說明
 xml類似資料庫,一般來說對資料庫有什麼操作,那麼對xml檔案也能實現什麼操作。 
資料庫增刪查改對應xml檔案就是新建xml檔案、增加xml檔案節點,刪除xml檔案節點,查詢xml檔案指定節點的值,修改xml檔案中節點的值。

下載連結

使用方法
將tinyxml2.cpp和tinyxml2.h拷貝至專案目錄,使用時包含 
#include "tinyxml2.h" 
using namespace tinyxml2;

示例
建立XML檔案
int createXML(const char* xmlPath)
{
    XMLDocument doc;
    if(3 != doc.LoadFile(xmlPath))
    {
        cout <<"file has been existed !"<<endl;
        return 0;
     }   

    //新增申明可以使用如下兩行
    XMLDeclaration* declaration=doc.NewDeclaration();
    doc.InsertFirstChild(declaration);

    XMLElement* root=doc.NewElement("XMLUSER");
    doc.InsertEndChild(root);


    XMLElement* userNode = doc.NewElement("User");
    /*新增屬性*/
    userNode->SetAttribute("Name","liangbaikai");
    userNode->SetAttribute("Password ","bbbbbb");
    root->InsertEndChild(userNode);

    return doc.SaveFile(xmlPath);
}
int main( int argc, const char ** argv )
{
    /*建立*/
    createXML("./xml/bbb.xml");
    /*增*/
    //addXML1("./xml/bbb.xml");/*新增性別,號碼,郵箱*/ /*再新增一個使用者*/
    //addXML2("./xml/bbb.xml");/*在性別後面新增年齡,再新增一個號碼*/
    /*刪*/
    //deleteXML("./xml/bbb.xml");/*刪除第一個號碼,刪除第二個號碼的屬性*/
    /*改*/
    //changeXML("./xml/bbb.xml");/*將liangbaikai的年齡改為10000歲,將wenbaikai的號碼改為8888結尾*/
    /*查*/
    //selectXML("./xml/bbb.xml");/*將liangbaikai的資訊打印出來*/
    return 0;
}

生成的檔案如下

<?xml version="1.0" encoding="UTF-8"?>
<XMLUSER>
    <User Name="liangbaikai" Password ="bbbbbb"/>
</XMLUSER>


int addXML1(const char* xmlPath)
{
    XMLDocument doc;
    if(doc.LoadFile(xmlPath) != 0)
    {
        cout<<"load xml file failed"<<endl;
        return false;
    }
    XMLElement* root=doc.RootElement();
    XMLElement* userNode=root->FirstChildElement("User");

    XMLElement* gender = doc.NewElement("Gender");
    XMLText* genderText=doc.NewText("man");
    gender->InsertFirstChild(genderText);
    userNode->InsertFirstChild(gender);

    XMLElement* mobile = doc.NewElement("Mobile");
    mobile->InsertFirstChild(doc.NewText("188****6211"));
    userNode->InsertEndChild(mobile);

    XMLElement* email = doc.NewElement("Email");
    email->InsertFirstChild(doc.NewText("1157***[email protected]"));
    userNode->InsertEndChild(email);

    XMLElement* userNode1 = doc.NewElement("User");
    userNode1->SetAttribute("Name","Wenbaikai");
    userNode1->SetAttribute("Password ","aaaaa");
    root->InsertEndChild(userNode1);

    XMLElement* mobile1 = doc.NewElement("Mobile");
    mobile1->InsertFirstChild(doc.NewText("166****6666"));
    userNode1->InsertEndChild(mobile1);

    return doc.SaveFile(xmlPath);
}

int addXML2(const char* xmlPath)
{
    XMLDocument doc;
    if(doc.LoadFile(xmlPath) != 0)
    {
        cout<<"load xml file failed"<<endl;
        return false;
    }
    XMLElement* root=doc.RootElement();
    XMLElement* userNode=root->FirstChildElement("User");

    XMLElement*gender = userNode->FirstChildElement("Gender");
    XMLElement* age = doc.NewElement("Age");
    age->InsertFirstChild(doc.NewText("18"));
    userNode->InsertAfterChild(gender,age);

    XMLElement*mobile = userNode->FirstChildElement("Mobile");
    mobile->SetAttribute("Location","home");
    XMLElement* mobile1 = doc.NewElement("Mobile");
    mobile1->SetAttribute("Location","company");
    mobile1->InsertFirstChild(doc.NewText("188****8888"));
    userNode->InsertAfterChild(mobile,mobile1);

    return doc.SaveFile(xmlPath);
}
int main( int argc, const char ** argv )
{
    /*建立*/
    createXML("./xml/bbb.xml");
    /*增*/
    addXML1("./xml/bbb.xml");/*新增性別,號碼,郵箱*/ /*再新增一個使用者*/
    addXML2("./xml/bbb.xml");/*在性別後面新增年齡,再新增一個號碼*/
    /*刪*/
    //deleteXML("./xml/bbb.xml");/*刪除第一個號碼,刪除第二個號碼的屬性*/
    /*改*/
    //changeXML("./xml/bbb.xml");/*將liangbaikai的年齡改為10000歲,將wenbaikai的號碼改為8888結尾*/
    /*查*/
    //selectXML("./xml/bbb.xml");/*將liangbaikai的資訊打印出來*/
    return 0;
}

效果如下

<?xml version="1.0" encoding="UTF-8"?>
<XMLUSER>
    <User Name="liangbaikai" Password="bbbbbb">
        <Gender>man</Gender>
        <Age>18</Age>
        <Mobile Location="home">188****6211</Mobile>
        <Mobile Location="company">188****8888</Mobile>
        <Email>1157***[email protected]</Email>
    </User>
    <User Name="Wenbaikai" Password="aaaaa">
        <Mobile>166****6666</Mobile>
    </User>
</XMLUSER>


int deleteXML(const char* xmlPath)
{
    XMLDocument doc;
    if(doc.LoadFile(xmlPath) != 0)
    {
        cout<<"load xml file failed"<<endl;
        return false;
    }
    XMLElement* root=doc.RootElement();
    XMLElement* userNode=root->FirstChildElement("User");
    XMLElement*mobile = userNode->FirstChildElement("Mobile");
    userNode->DeleteChild(mobile);
    XMLElement*mobile1 = userNode->FirstChildElement("Mobile");
    mobile1->DeleteAttribute("Location");
    return doc.SaveFile(xmlPath);
}
int main( int argc, const char ** argv )
{
    /*建立*/
    createXML("./xml/bbb.xml");
    /*增*/
    addXML1("./xml/bbb.xml");/*新增性別,號碼,郵箱*/ /*再新增一個使用者*/
    addXML2("./xml/bbb.xml");/*在性別後面新增年齡,再新增一個號碼*/
    /*刪*/
    deleteXML("./xml/bbb.xml");/*刪除第一個號碼,刪除第二個號碼的屬性*/
    /*改*/
    //changeXML("./xml/bbb.xml");/*將liangbaikai的年齡改為10000歲,將wenbaikai的號碼改為8888結尾*/
    /*查*/
    //selectXML("./xml/bbb.xml");/*將liangbaikai的資訊打印出來*/
    return 0;
}

效果如下

<?xml version="1.0" encoding="UTF-8"?>
<XMLUSER>
    <User Name="liangbaikai" Password="bbbbbb">
        <Gender>man</Gender>
        <Age>18</Age>
        <Mobile>188****8888</Mobile>
        <Email>1157***[email protected]</Email>
    </User>
    <User Name="Wenbaikai" Password="aaaaa">
        <Mobile>166****6666</Mobile>
    </User>
</XMLUSER>


int changeXML(const char* xmlPath)
{
    XMLDocument doc;
    if(doc.LoadFile(xmlPath)!=0)
    {
        cout<<"load xml file failed"<<endl;
        return false;
    }
    XMLElement* root=doc.RootElement();
    XMLElement* userNode=root->FirstChildElement("User");
    while(userNode != NULL)
    {
        if( 0 == strncmp("liangbaikai",(userNode->Attribute("Name")),11))
        {
            userNode->FirstChildElement("Age")->SetText("10000");
            userNode = userNode->NextSiblingElement();
        }
        else if(( 0 == strncmp("Wenbaikai",(userNode->Attribute("Name")),11)))
        {
            userNode->FirstChildElement("Mobile")->SetText("166****8888");
            userNode = userNode->NextSiblingElement();
        }
        else
        {
            userNode = userNode->NextSiblingElement();
        }
    }
    return doc.SaveFile(xmlPath);
}
int main( int argc, const char ** argv )
{
    /*建立*/
    createXML("./xml/bbb.xml");
    /*增*/
    addXML1("./xml/bbb.xml");/*新增性別,號碼,郵箱*/ /*再新增一個使用者*/
    addXML2("./xml/bbb.xml");/*在性別後面新增年齡,再新增一個號碼*/
    /*刪*/
    deleteXML("./xml/bbb.xml");/*刪除第一個號碼,刪除第二個號碼的屬性*/
    /*改*/
    changeXML("./xml/bbb.xml");/*將liangbaikai的年齡改為10000歲,將wenbaikai的號碼改為8888結尾*/
    /*查*/
    //selectXML("./xml/bbb.xml");/*將liangbaikai的資訊打印出來*/
    return 0;
}

效果如下

<?xml version="1.0" encoding="UTF-8"?>
<XMLUSER>
    <User Name="liangbaikai" Password="bbbbbb">
        <Gender>man</Gender>
        <Age>10000</Age>
        <Mobile>188****8888</Mobile>
        <Email>1157***[email protected]</Email>
    </User>
    <User Name="Wenbaikai" Password="aaaaa">
        <Mobile>166****8888</Mobile>
    </User>
</XMLUSER>


int selectXML(const char* xmlPath)
{
    XMLDocument doc;
    if(doc.LoadFile(xmlPath)!=0)
    {
        cout<<"load xml file failed"<<endl;
        return false;
    }
    XMLElement* root=doc.RootElement();
    XMLElement* userNode=root->FirstChildElement("User");
    while(userNode != NULL)
    {
        if( 0 == strncmp("liangbaikai",(userNode->Attribute("Name")),11))
        {
            cout << userNode->Attribute("Name") << endl;
            cout << userNode->Attribute("Password") << endl;
            cout << userNode->FirstChildElement("Age")->GetText() << endl;
            cout << userNode->FirstChildElement("Gender")->GetText() << endl;
            cout << userNode->FirstChildElement("Mobile")->GetText() << endl;
            cout << userNode->FirstChildElement("Email")->GetText() << endl;
            userNode = userNode->NextSiblingElement();
        }
        else
        {
            userNode = userNode->NextSiblingElement();
        }
    }
    return 0;
}

int main( int argc, const char ** argv )
{
    /*建立*/
    createXML("./xml/bbb.xml");
    /*增*/
    addXML1("./xml/bbb.xml");/*新增性別,號碼,郵箱*/ /*再新增一個使用者*/
    addXML2("./xml/bbb.xml");/*在性別後面新增年齡,再新增一個號碼*/
    /*刪*/
    deleteXML("./xml/bbb.xml");/*刪除第一個號碼,刪除第二個號碼的屬性*/
    /*改*/
    changeXML("./xml/bbb.xml");/*將liangbaikai的年齡改為10000歲,將wenbaikai的號碼改為8888結尾*/
    /*查*/
    selectXML("./xml/bbb.xml");/*將liangbaikai的資訊打印出來*/
    return 0;
}

效果如下

liangbaikai
bbbbbb
10000
man
188****8888
1157***[email protected]