c++之xml的创建,增删改查

c++之xml的创建,增删改查

    • 1.创建写入
    • 2.添加
    • 3.删除
    • 4.修改:

1.创建写入

#include 
#include 
#include "F:/EDGE/tinyxml/tinyxml.h"
#include 
#include 
#include 

#pragma comment(lib, "ws2_32.lib")

using namespace std;
void main() {
    printf("\n----- XML -----\n");

    //新建一个xml文件
    // 定义一个TiXmlDocument类指针
    TiXmlDocument* tinyXmlDoc = new TiXmlDocument();



    // xml的声明(三个属性:版本,编码格式,保留空串即可)
    TiXmlDeclaration* tinyXmlDeclare = new TiXmlDeclaration("1.0", "utf-8", "");    // 声明头部格式
    // 插入文档类中
    tinyXmlDoc->LinkEndChild(tinyXmlDeclare);



    // 根节点
    TiXmlElement* Library = new TiXmlElement("Library");
    tinyXmlDoc->LinkEndChild(Library);        // 把根节点插入到文档类中



    // 创建Book节点
    TiXmlElement* Book = new TiXmlElement("Book");
    TiXmlText* bookText = new TiXmlText("书本");    // 创建文本
    Book->LinkEndChild(bookText);    // 给Book节点添加文本
    Library->LinkEndChild(Book);    // 插入到根节点下


    // 创建Book1节点
    TiXmlElement* Book1 = new TiXmlElement("Book1");
    // 插入属性
    Book1->SetAttribute("ID", 1);
    Book1->SetAttribute("Name", "红楼梦");
    Book1->SetAttribute("Price", "64.6");

    // 创建Book1的子节点Description
    TiXmlElement* Description = new TiXmlElement("Description");
    TiXmlText* descriptionText = new TiXmlText("林黛玉");        // 创建文本
    Description->LinkEndChild(descriptionText);        // 给Description节点添加文本
    Book1->LinkEndChild(Description);                // 插入到Book1节点下

    // 创建Book1的子节点Page
    TiXmlElement* Page = new TiXmlElement("Page");
    TiXmlText* pageText = new TiXmlText("500页");        // 创建文本
    Page->LinkEndChild(pageText);    // 给Page节点添加文本
    Book1->LinkEndChild(Page);        // 插入到Book1节点下

    Library->LinkEndChild(Book1);    // 插入到根节点下



    // 保存到文件    
    /*bool result = tinyXmlDoc->SaveFile("E:\\abs\\test.xml");
    if (result == true) printf("文件写入成功!\n");
    else printf("文件写入失败!\n");*/
    
    // 打印出来看看
    //tinyXmlDoc->Print();

    TiXmlPrinter a;
    tinyXmlDoc->Accept(&a);
    printf("%s\n", a.CStr());
    printf(typeid(a.CStr()).name());
    
}

打印:
c++之xml的创建,增删改查_第1张图片

2.添加

#include 
#include 
#include "F:/EDGE/tinyxml/tinyxml.h"
#include 
#include 
#include 

#pragma comment(lib, "ws2_32.lib")

using namespace std;

void main() {
    printf("\n----- add_XML -----\n");

    // 定义一个TiXmlDocument类指针
    TiXmlDocument* tinyXmlDoc = new TiXmlDocument("E:\\abs\\test.xml");
    tinyXmlDoc->LoadFile(TIXML_ENCODING_LEGACY);

    // 读取文档声明信息(也就是xml的头部信息:)
    TiXmlDeclaration* pDeclar = tinyXmlDoc->FirstChild()->ToDeclaration();
    if (pDeclar != NULL) {
        printf("头部信息: version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
    }

    // 得到文件根节点
    TiXmlElement* Library = new TiXmlElement("Library");
    Library = tinyXmlDoc->RootElement();


    // 创建Book1节点
    TiXmlElement* Book1 = new TiXmlElement("Book1");
    // 插入属性
    Book1->SetAttribute("ID", 2);
    Book1->SetAttribute("Name", "西游记");
    Book1->SetAttribute("Price", "99.81");

    // 创建Book1的子节点Description
    TiXmlElement* Description = new TiXmlElement("Description");
    TiXmlText* descriptionText = new TiXmlText("师徒四人");        // 创建文本
    Description->LinkEndChild(descriptionText);        // 给Description节点添加文本
    Book1->LinkEndChild(Description);                // 插入到Book1节点下

    // 创建Book1的子节点Page
    TiXmlElement* Page = new TiXmlElement("Page");
    TiXmlText* pageText = new TiXmlText("81页");        // 创建文本
    Page->LinkEndChild(pageText);    // 给Page节点添加文本
    Book1->LinkEndChild(Page);        // 插入到Book1节点下

    Library->LinkEndChild(Book1);    // 插入到根节点下




    // 创建Book1节点
    Book1 = new TiXmlElement("Book1");
    // 插入属性
    Book1->SetAttribute("ID", 3);
    Book1->SetAttribute("Name", "三国演义");
    Book1->SetAttribute("Price", "66.66");

    // 创建Book1的子节点Description
    Description = new TiXmlElement("Description");
    descriptionText = new TiXmlText("三国大战");        // 创建文本
    Description->LinkEndChild(descriptionText);        // 给Description节点添加文本
    Book1->LinkEndChild(Description);                // 插入到Book1节点下

    // 创建Book1的子节点Page
    Page = new TiXmlElement("Page");
    pageText = new TiXmlText("30页");        // 创建文本
    Page->LinkEndChild(pageText);    // 给Page节点添加文本
    Book1->LinkEndChild(Page);        // 插入到Book1节点下

    Library->LinkEndChild(Book1);    // 插入到根节点下


    // 保存到文件    
    bool result = tinyXmlDoc->SaveFile("E:\\abs\\test.xml");
    if (result == true) printf("文件写入成功!\n");
    else printf("文件写入失败!\n");

    // 打印出来看看
    tinyXmlDoc->Print();
}


打印:
c++之xml的创建,增删改查_第2张图片

3.删除

#include 
#include 
#include "F:/EDGE/tinyxml/tinyxml.h"
#include 
#include 
#include 

#pragma comment(lib, "ws2_32.lib")

using namespace std;


void main() {
    printf("\n----- del_XML -----\n");

    // 定义一个TiXmlDocument类指针
    TiXmlDocument* tinyXmlDoc = new TiXmlDocument("E:\\abs\\test.xml");
    tinyXmlDoc->LoadFile(TIXML_ENCODING_LEGACY);

    // 读取文档声明信息(也就是xml的头部信息:)
    TiXmlDeclaration* pDeclar = tinyXmlDoc->FirstChild()->ToDeclaration();
    if (pDeclar != NULL) {
        printf("头部信息: version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
    }

    // 得到文件根节点
    TiXmlElement* Library = new TiXmlElement("Library");
    Library = tinyXmlDoc->RootElement();


    /* 删除 Book 节点 */
    // 方式一
    //TiXmlElement* Book = Library->FirstChildElement("Book");
    //Book->Clear();


    // 方式二
    // 获取Book节点
    TiXmlElement* Book = Library->FirstChildElement("Book");
    Library->RemoveChild(Book->ToElement());


    //TiXmlElement* pItem1 = Library->FirstChildElement("Book");
    //for (; pItem1 != NULL; ) {

    //    if (strncmp(pItem1->GetText(), "书本", 6) == 0) {
    //        // 提前存储删除节点的下一个节点
    //        TiXmlElement* temporary = pItem1->NextSiblingElement("Book1");

    //        // 删除当前节点,删除后pItem为NULL,如果再继续使用它会报错
    //        Library->RemoveChild(pItem1->ToElement());

    //        // 所以这里要进行赋值回来
    //        pItem1 = temporary;
    //    
    //    } else {
    //        // 寻找下一个Book1节点
    //        pItem1 = pItem1->NextSiblingElement("Book1");
    //    }
    //}



    // 删除属性
    TiXmlElement* pItem = Library->FirstChildElement("Book1");
    for (; pItem != NULL; pItem = pItem->NextSiblingElement("Book1")) {

        // 找到属性ID = 1的节点
        if (strcmp(pItem->Attribute("ID"), "1") == 0) {
            // 删除属性为Name的属性
            pItem->RemoveAttribute("Name");
        }
    }

    // 删除整个节点
    pItem = Library->FirstChildElement("Book1");
    for (; pItem != NULL; ) {

        // 找到属性ID = 2的节点
        if (strcmp(pItem->Attribute("ID"), "2") == 0) {
            // 提前存储删除节点的下一个节点
            TiXmlElement* temporary = pItem->NextSiblingElement("Book1");

            // 删除当前节点,删除后pItem为NULL,如果再继续使用它会报错
            Library->RemoveChild(pItem->ToElement());

            // 所以这里要进行赋值回来
            pItem = temporary;

        }
        else {
            // 寻找下一个Book1节点
            pItem = pItem->NextSiblingElement("Book1");
        }
    }




    // 保存到文件    
    bool result = tinyXmlDoc->SaveFile("E:\\abs\\test.xml");
    if (result == true) printf("文件写入成功!\n");
    else printf("文件写入失败!\n");

    // 打印出来看看
    tinyXmlDoc->Print();

}






打印:
c++之xml的创建,增删改查_第3张图片

4.修改:

#include 
#include 
#include "F:/EDGE/tinyxml/tinyxml.h"
#include 
#include 
#include 

#pragma comment(lib, "ws2_32.lib")

using namespace std;

void main() {
    printf("\n----- alt_XML -----\n");

    // 定义一个TiXmlDocument类指针
    TiXmlDocument* tinyXmlDoc = new TiXmlDocument("E:\\abs\\test.xml");
    tinyXmlDoc->LoadFile(TIXML_ENCODING_LEGACY);

    // 读取文档声明信息(也就是xml的头部信息:)
    TiXmlDeclaration* pDeclar = tinyXmlDoc->FirstChild()->ToDeclaration();
    if (pDeclar != NULL) {
        printf("头部信息: version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding());
    }

    // 得到文件根节点
    TiXmlElement* Library = new TiXmlElement("Library");
    Library = tinyXmlDoc->RootElement();


    TiXmlElement* pItem = Library->FirstChildElement("Book1");
    for (; pItem != NULL; pItem = pItem->NextSiblingElement("Book1")) {

        // 找到属性ID = 1的节点
        if (strcmp(pItem->Attribute("ID"), "1") == 0) {
            // 设置Book1的子节点Description的值
            TiXmlElement* Description = pItem->FirstChildElement("Description");    // 获得108个没房住
            TiXmlNode* des = Description->FirstChild();    // 获取元素指针        // 获得存储 108个没房住 的指针
            des->SetValue("108个没房住");    // 重新为其设置值                

            TiXmlElement* Page = pItem->FirstChildElement("Page");
            TiXmlNode* page = Page->FirstChild();
            page->SetValue("999页");
        }

        // 设置属性
        if (strcmp(pItem->Attribute("ID"), "3") == 0) {
            pItem->SetAttribute("Price", "33.33");
        }
    }


    // 保存到文件    
    bool result = tinyXmlDoc->SaveFile("E:\\abs\\test.xml");
    if (result == true) printf("文件写入成功!\n");
    else printf("文件写入失败!\n");
    //printf("%s\n", tinyXmlDoc->Value());
    // 打印出来看看
    tinyXmlDoc->Print();
}





打印:
c++之xml的创建,增删改查_第4张图片

你可能感兴趣的:(c++,笔记,c++,xml,开发语言)