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

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();
}





打印:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/147106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

王道数据结构课后代码题p40 6.有一个带头结点的单链表L,设计一个算法使其元素递增有序 (c语言代码实现)

这一题其实用到了直接插入排序的思想 视频讲解在这里哦&#xff1a;&#x1f447; p40 第6题 王道数据结构课后代码题 c语言代码实现_哔哩哔哩_bilibili 本题代码为 void paixu(linklist* L)//对单链表内的元素排序 {lnode* p (*L)->next;lnode* pre *L;lnode* r p-&…

Skybox天空盒子的更换教程_unity基础开发教程

Skybox天空盒子的更换 Skybox的下载与导入更换SkyboxSkybox属性自定义 Skybox的下载与导入 打开资源商店 搜索FREE Skybox 这里是我使用的是这一款资源&#xff0c;点击添加至我的资源 打开包管理器Package Manager Packages选择My Assets 搜索Sky 选择刚刚添加的天空盒子 点…

3D Gaussian Splatting文件的压缩【3D高斯泼溅】

在上一篇文章中&#xff0c;我开始研究高斯泼溅&#xff08;3DGS&#xff1a;3D Gaussian Splatting&#xff09;。 它的问题之一是数据集并不小。 渲染图看起来不错。 但“自行车”、“卡车”、“花园”数据集分别是一个 1.42GB、0.59GB、1.35GB 的 PLY 文件。 它们几乎按原样…

西门子精彩触摸屏SMART LINE V4 面板使用U盘下载项目程序的具体方法示例

西门子精彩触摸屏SMART LINE V4 面板使用U盘下载项目程序的具体方法示例 WinCC flexible SMART V4 SP1 软件针对SMART LINE V4 面板新增了使用U盘下载项目功能。 注意:“使用U盘下载项目”功能仅支持触摸屏OS版本为V4.0.1.0 及以上的设备。 使用U盘下载项目的步骤可参考以下内…

php+vue3实现点选验证码

buildadmin 中的点选验证码实现 验证码类 <?phpnamespace ba;use Throwable; use think\facade\Db; use think\facade\Lang; use think\facade\Config;/*** 点选文字验证码类*/ class ClickCaptcha {/*** 验证码过期时间(s)* var int*/private int $expire 600;/*** 可以…

【洛谷算法题】P5711-闰年判断【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5711-闰年判断【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…

【LeetCode刷题笔记】二叉树(二)

257. 二叉树的所有路径 解题思路: 1. DFS 前序遍历 ,每次递归将 当前节点的拼接结果 传递到 下一层 中,如果当前节点是 叶子节点 ,就将 当前拼接结果 收集答案并返回。 注意:路径path结果可以使用 String 来拼接,这样可以避免回溯处理。

Scala---方法与函数

一、Scala方法的定义 有参方法&无参方法 def fun (a: Int , b: Int) : Unit {println(ab) } fun(1,1)def fun1 (a: Int , b: Int) ab println(fun1(1,2)) 注意点&#xff1a; 方法定义语法 用def来定义可以定义传入的参数&#xff0c;要指定传入参数的类型方法可以写返…

时间序列基础->数据标签、数据分割器、数据加载器的定义和讲解(零基础入门时间序列)

一、本文介绍 各位小伙伴好&#xff0c;最近在发时间序列的实战案例中总是有一些朋友问我时间序列中的部分对数据的操作是什么含义&#xff0c;我进行了挺多的介绍和讲解但是问的人越来越多&#xff0c;所以今天在这里单独发一篇文章来单独的讲一下时间序列中对数据的处理操作…

PHP使用文件缓存实现html静态化

<?php // 动态生成的内容 $content "<html><body><h1>time:".date("Y-m-d H:i:s")."</h1></body></html>"; // 静态文件保存路径和文件名 $staticFilePath "file.html"; if(file_exists($s…

【汇编】内存的读写与地址空间、寄存器及数据存储

文章目录 前言一、CPU对存储器的读写1.1 cpu对存储器的读写如何进行&#xff1f;1.2 演示 二、内存地址空间三、将各类存储器看作一个逻辑存储器——统一编址内存地址空间的分配方案 三、CPU的组成寄存器是CPU内部的信息存储单元通用寄存器--AX为例“横看成岭侧成峰“ 四、“字…

工具及方法 - 手机扫条码工具: SCANDIT APP

一般扫个链接使用微信扫一扫即可。扫具体条码&#xff0c;可以在微信里搜索小程序&#xff0c;打开也能扫&#xff0c;得到条码内容。 还有其他方式&#xff0c;比如使用淘宝、百度等APP也可以直接扫码条码&#xff0c;还能得到更多的信息。 使用百度的话&#xff0c;不扫条码…

Vue中methods实现原理

目录 前言 回调函数中的this指向问题 vue实例访问methods methods实现原理 前言 vue实例对象为什么可以访问methods中的函数方法&#xff1f;methods的实现原理是什么&#xff1f; 回调函数中的this指向问题 在解答前言中的问题前&#xff0c;需要了解一下回调函数中的th…

振南技术干货集:深入浅出的Bootloader(2)

注解目录 1、烧录方式的更新迭代 1.1 古老的烧录方式 (怀旧一下&#xff0c;单片机高压烧录器。) 1.2 ISP 与ICP 烧录方式 (还记得当年我们玩过的 AT89S51?) 1.3 更方便的 ISP 烧录方式 1.3.1串口 ISP &#xff08;是 STC 单片机成就了我们&#xff0c;还是我们成就了…

C#,数值计算——函数计算,Ratfn的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Ratfn { private double[] cofs { get; set; } private int nn { get; set; } private int dd { get; set; } public Ratfn(double[] num, double[] den) { …

编辑器vim和编译器gcc/g++

目录 一、编辑器vim 1、概念 2、基本操作 1、进入vim 2、模式切换 3、命令行模式 4、插入模式 5、底行模式 6、vim 的配置 二、编译器gcc/g 1、概念 2、背景知识 3、gcc/g中的编译链接 1、预处理 2、编译 3、汇编 4、链接 4、函数库 1、静态库 2、动态库 一…

服务器数据恢复—服务器发生故障导致数据丢失如何恢复服务器数据?

服务器常见故障&#xff1a; 硬件故障&#xff1a;磁盘、板卡、电源故障等。 软件故障&#xff1a;操作系统崩溃、程序运行错误等。 入侵破坏&#xff1a;加密、删除服务数据等。 不可控力&#xff1a;浸水、火烧、倒塌等。 误操作&#xff1a;格式化、删除、覆盖等。 如何减少…

详解[ZJCTF 2019]NiZhuanSiWei 1(PHP两种伪协议、PHP反序列化漏洞、PHP强比较)还有那道题有这么经典?

题目环境&#xff1a; <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){echo "<br><h1>&…

WebStorm配置less编译wxss或css

文章目录 前言先下载安装less程序&#xff1a;实参&#xff1a;要刷新的输出路径成功 前言 使用WebStorm写微信小程序&#xff0c;wxss写着很麻烦&#xff0c;就想着用less&#xff0c;接下来是配置less编译 先下载安装less npm install -g lessless会安装在你当前目录下(以D…

虹科示波器 | 汽车免拆检修 | 2014款保时捷卡宴车行驶中发动机偶尔自动熄火

一、故障现象 一辆2014款保时捷卡宴车&#xff0c;搭载4.8L自然吸气发动机&#xff0c;累计行驶里程约为10.3万km。车主反映&#xff0c;行驶中发动机偶尔自动熄火&#xff0c;尤其在减速至停车的过程中故障容易出现。 二、故障诊断 接车后路试&#xff0c;确认故障现象与车主所…