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

news2024/11/20 8:46:10

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





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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch多GPU并行训练: DistributedDataParallel

1 模型并行化训练 1.1 为什么要并行训练 在训练大型数据集或者很大的模型时一块GPU很难放下&#xff0c;例如最初的AlexNet就是在两块GPU上计算的。并行计算一般采取两个策略&#xff1a;一个是模型并行&#xff0c;一个是数据并行。左图中是将模型的不同部分放在不同GPU上进…

2023年最新前端面试题汇总大全(含答案超详细,HTML,JS,CSS汇总篇)-- 持续更新

专项练习–持续更新 HTML篇CSS篇JS篇Vue篇TypeScript篇React篇微信小程序篇前端面试题汇总大全二&#xff08;含答案超详细&#xff0c;Vue&#xff0c;TypeScript&#xff0c;React&#xff0c;微信小程序&#xff0c;Webpack 汇总篇&#xff09;-- 持续更新 前端面试题汇总大…

微信昵称后面的“小耳朵”是干什么用的?

微信&#xff0c;一款我们日常使用频繁的社交软件&#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…

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

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

Android实验:Activity界面基础

目录 前言实验目的实验内容实验要求代码实现mainActivityResultActivityactivity_mainactivity_result 结果展示 前言 我们都知道&#xff0c;activity是Android中最重要的组件之一&#xff0c;关于activity的具体内容在这里就不多赘述&#xff0c;主打的就是一个主次分明&…

使用 PYTORCH 进行图像风格迁移

一、介绍 本教程介绍如何实现 由 Leon A. Gatys、Alexander S. Ecker 和 Matthias Bethge 开发的神经风格算法。神经风格或神经传输允许您拍摄图像并以新的艺术风格再现它。该算法采用三幅图像&#xff0c;即输入图像、内容图像和风格图像&#xff0c;并将输入更改为类似于内容…

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

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

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

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

Vue3 Computed属性

一、引入computed import { computed } from vue; 二、计算属性的使用 &#xff08;一&#xff09;计算属性简写形式 计算属性 computed( ()> { return 计算属性值 }) setup() {let nums reactive({ten: 0, // 十位unit: 0, // 个位});nums.sum computed(() > {re…

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) { …

Python 如何实现组合(Composite)设计模式?什么是组合设计模式?

什么是组合&#xff08;Composite&#xff09;设计模式&#xff1f; 组合&#xff08;Composite&#xff09;设计模式是一种结构型设计模式&#xff0c;它允许客户端使用单一对象和组合对象&#xff08;对象的组合形成树形结构&#xff09;同样的方式处理。这样&#xff0c;客…

Ubuntu22.04源码安装ROS-noetic(ROS1非ROS2),编译运行VINS-MONO

1. Ubuntu22.04源码编译安装ROS-noetic 由于22.04默认安装ROS2&#xff0c;但很多仓库都是基于ROS1的&#xff0c;不想重装系统&#xff0c;参考这两个博客安装了ROS-noetic&#xff1a; 博客1. https://blog.csdn.net/Drknown/article/details/128701624博客2. https://zhua…

php 插入排序算法实现

插入排序是一种简单直观的排序算法&#xff0c;它的基本思想是将一个数据序列分为有序区和无序区&#xff0c;每次从无序区选择一个元素插入到有序区的合适位置&#xff0c;直到整个序列有序为止 5, 3, 8, 2, 0, 1 HP中可以使用以下代码实现插入排序算法&#xff1a; functi…

“具有分布式能源资源的多个智能家庭的能源管理的联邦强化学习”文章学习一

一、摘要 本文提出了一种新型的联邦强化学习&#xff08;FRL&#xff09;方法&#xff0c;用于管理带有家电、太阳能光伏系统和储能系统的多个智能家庭的能源。 所提出的FRL方法的创新点在于开发了一种由本地家庭能源管理系统(LHEMS)和全局服务器(GS)组成的分布式深度强化学习(…

2023-11-15 LeetCode每日一题(K 个元素的最大和)

2023-11-15每日一题 一、题目编号 2656. K 个元素的最大和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。将选中…

保姆级前端翻牌效果(CSS)

效果 翻牌效果 hover 时候 代码直接上 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

【ArcGIS Pro微课1000例】0032:创建具有指定高程Z值的矢量数据

本文讲解ArcGIS Pro中创建具有指定高程值的矢量数据的两种方法。 文章目录 一、独立创建1. 新建地图场景2. 新建shapefile3. 绘制多边形4. 添加高程字段5. 三维显示二、基于高程源创建1. 创建栅格范围2. 添加Z值字段3. 添加Z信息4. 要素更新Z值一、独立创建 1. 新建地图场景 …

编辑器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、动态库 一…

创新的Sui项目在CoinDCX的Unfold 2023黑客松中获奖

近日&#xff0c;在印度班加罗尔&#xff08;Bengaluru&#xff09;&#xff0c;超过2500人参加了CoinDCX组织的综合性Web3活动Unfold 2023。作为讨论、聚会和活动的一部分&#xff0c;进行了一次多链黑客松&#xff0c;Sui联合赞助了该活动。所有团队&#xff0c;无论他们构建…