c++之xml的创建,增删改查
- 1.创建写入
 - 2.添加
 - 3.删除
 - 4.修改:
 
1.创建写入
#include <stdio.h>
#include <typeinfo>
#include "F:/EDGE/tinyxml/tinyxml.h"
#include <iostream>
#include <string>
#include <Winsock2.h>
#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());
    
}
 
打印:
 
2.添加
#include <stdio.h>
#include <typeinfo>
#include "F:/EDGE/tinyxml/tinyxml.h"
#include <iostream>
#include <string>
#include <Winsock2.h>
#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的头部信息:<?xml version="1.0" encoding="utf-8" ?>)
    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();
}
 
打印:
 
3.删除
#include <stdio.h>
#include <typeinfo>
#include "F:/EDGE/tinyxml/tinyxml.h"
#include <iostream>
#include <string>
#include <Winsock2.h>
#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的头部信息:<?xml version="1.0" encoding="utf-8" ?>)
    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();
}
 
打印:
 
4.修改:
#include <stdio.h>
#include <typeinfo>
#include "F:/EDGE/tinyxml/tinyxml.h"
#include <iostream>
#include <string>
#include <Winsock2.h>
#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的头部信息:<?xml version="1.0" encoding="utf-8" ?>)
    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");    // 获得<Description>108个没房住</Description>
            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();
}
 
打印:
 



















