咨询网站源码/2022年十大流行语
👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:Unity基础实战
⭐🅰️⭐
文章目录
- ⭐🅰️⭐
- ⭐前言⭐
- XML是什么
- 和游戏存储的关系
- 🎶(==A==) XML文件格式
- 🎶(==B==) XML基本规则
- 🎶(==C==) XML属性
- 🎶(==D==) 读取XML文件(c#)
- 🎶(==E==) 读取XML文件中的信息(c#)
- 🎶(==F==) 存储XML文件中的信息(c#)
- 🎶(==G==) 修改XML文件中的信息(c#)
- 🎶(==s==) XML 练习
- XML编写练习
- 读取练习
- 存取练习
- ⭐🅰️⭐
⭐前言⭐
XML是什么
XML(Extensible Markup Language)是一种类似于 HTML,但是没有使用预定义标记的语言。因此,可以根据自己的设计需求定义专属的标记。这是一种强大将数据存储在一个可以存储、搜索和共享的格式中的方法。最重要的是,因为 XML 的基本格式是标准化的,如果你在本地或互联网上跨系统或平台共享或传输 XML,由于标准化的 XML 语法,接收者仍然可以解析数据。
- 全称可拓展标记语言extentsible markup language
- XML是国际通用的
- 它是被设计用来传输和存储数据的一种文本特殊格式
和游戏存储的关系
- 游戏数据按照XML的格式标准——>存储在XML文档中
- 再将XML文档存储在硬盘上或者传输给远端——达到数据持久化
一种存储和传输数据的选择
一种配置数据的方法
🎶(A) XML文件格式
特点: 是一种树形结构
- 注释的格式:——!–在这里写注释–
_________
- 固定的格式——?xml version =“1.0” encoding = “UTF-8”?
- UTF - 8是什么意思
和ASCII码一样它也是一种编码格式只不过ASCII码是最原始的编码格式
世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码.电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
ASCII,Unicode和UTF-8终于找到一个能完全搞清楚的文章了
🎶(B) XML基本规则
符号 | 含义 |
---|---|
< — < | 小于 |
> — > | 大于 |
& — & | 和 |
&apos — ’ | 单引号 |
" — " | 引号 |
注意:
1.每个元素都必须有关闭标签
2.元素命名规则基本遵照C#中变量名命名规则
3.XML标签要注意大小写
4.XML文档必须有根元素
🎶(C) XML属性
- 属性的特点
属性就是在元素标签后面空格 添加的内容
注意: 属性必须用引号包裹 单引号双引号都可以
-
属性写法
元素节点 —————————————> 属性
作用都一样
-
格式验证方法
菜鸟教程XML 格式验证器
- 练习
当出现没有变量名的数据时 就用变量类型名命名
🎶(D) 读取XML文件(c#)
-
Xml文件存放位置
-
1.只读不写的XML文件可以放在
Resources或者StreamingAssets 文件夹下 -
2.动态存储的XML文件放在
Application.persistentDataPath 路径下
C#读取XML的方法有3种
- 1.XmlDocument (把数据加载到内存中,使用XmlDocument类读取是较方便最容易理解和操作的方法)
- 2.XmlTextReader (以流形式加载,内存占用更少,但是是单向只读,使用不是特别方便,除非有特殊需求,否则不会使用)
- 3.Linq
XmlDocument
XmlDocument xml = new XmlDocument();
- 1.xml文件名加载——存放在Resorces文件夹下的xml文件加载处理
//为TextAsset Resorces文件夹下的文本类TextAsset asset = Resources.Load<TextAsset>("xml文件名");print(asset.text);//加载为xml对象xml.LoadXml(asset.text);
- 2.通过xml文件的路径加载——存放在StreamingAssets 文件夹下的xml文件加载处理
xml.Load(Application.streamingAssetsPath + "/xml文件名.xml");
//streamingAssetsPath 文件夹只读(移动端)pc(可读可写)
注意: 为什么不读Resource文件夹的路径,因为打包后它被压缩了读不到
🎶(E) 读取XML文件中的信息(c#)
XmlDocument xml = new XmlDocument();
1.相关类:
- XmlNode 单个节点信息类
- XmlNodeList 多个节点信息类
- XmlDocument 用于创建节点 存储文件
- XmlDeclaration 用于添加版本信息
- XmlElement 节点类
2.获取xml当中的根节点:
- XmlNode root = xml.SelectSingleNode(“根节点名”);
3.获取下面的子节点:
- XmlNode nodeName = root.SelectSingleNode(“name”);
4.获取节点包裹的元素信息
- nodeName.InnerText
5.获取节点属性信息
- XmlNode nodeItem = root.SelectSingleNode(“Item”);
- ①nodeItem.Attributes[“属性名”].Value
- ②nodeItem.Attributes.GetNamedItem(“属性名”).Value
6.获取 一个节点下的同名节点的方法
为什么会有同名?
因为当出现没有变量名的数据时 就用变量类型名命名
- XmlNode nodeListInt = root.SelectSingleNode(“ListInt”);
- XmlNodeList intList = nodeListInt.SelectNodes(“int”);
7.得到之后遍历
- 迭代器遍历 foreach (XmlNode node in intList )
- for循环遍历 for (int i = 0; i < intList .Count; i++)
8.得到子节点的子节点
- 写法一
XmlNode node = Xml.SelectSingleNode(“Root”).SelectSingleNode(“name”); - 写法二
XmlNode node = Xml.SelectSingleNode(“Root/name”);
🎶(F) 存储XML文件中的信息(c#)
- 特殊文件夹读写性回顾
1.Resources 可读 不可写 打包后找不到
2.Application.streamingAssetsPath 可读 PC端可写 找得到
3.Application.dataPath 打包后找不到
4.Application.persistentDataPath 可读可写找得到
存储xml文件 在Unity中一定是使用各平台都可读可写可找到的路径
1.相关类:
- XmlNode 单个节点信息类
- XmlNodeList 多个节点信息类
- XmlDocument 用于创建节点 存储文件
- XmlDeclaration 用于添加版本信息
- XmlElement 节点类
通过代码API创建XML信息,不需要手动编写的流程
- 0.及记录存储文件夹信息的路径
string path = Application.persistentDataPath + "/要创建的文件夹名.xml";
-
1.创建文本对象
XmlDocument xml = new XmlDocument();
-
2.添加固定版本信息
//相当于就是创建<?xml version="1.0" encoding="UTF-8"?>这句XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");//创建完成过后 要添加进入 文本对象中xml.AppendChild(xmlDec);
- 3. 添加根节点
XmlElement root = xml.CreateElement("Root");xml.AppendChild(root);
- 4.为根节点添加子节点
XmlElement name = xml.CreateElement("name");name.InnerText = "孙悟空";root.AppendChild(name);XmlElement age = xml.CreateElement("age");atk.InnerText = "10";root.AppendChild(age);XmlElement listInt = xml.CreateElement("listInt");//子节点里面加子节点组for (int i = 1; i <= 3; i++){XmlElement childNode = xml.CreateElement("int");childNode.InnerText = i.ToString();listInt.AppendChild(childNode);}root.AppendChild(listInt);
- 5.添加属性
XmlElement itemList = xml.CreateElement("itemList");for (int i = 1; i <= 3; i++){XmlElement childNode = xml.CreateElement("Item");//添加属性childNode.SetAttribute("id", i.ToString());childNode.SetAttribute("num", (i * 10).ToString());itemList.AppendChild(childNode);}root.AppendChild(itemList);
-
6.保存
xml.Save(path);
🎶(G) 修改XML文件中的信息(c#)
1.相关类:
- XmlNode 单个节点信息类
- XmlNodeList 多个节点信息类
- XmlDocument 用于创建节点 存储文件
- XmlDeclaration 用于添加版本信息
- XmlElement 节点类
string path = Application.persistentDataPath + “/要创建的文件夹名.xml”;
- 1.判断是否存在文件
File.Exists(path)
- 2.加载XML文件API
newXml.Load(path);
【newXml -> XmlDocument类】
- 3.创建节点
newXml.CreateElement(“节点名字”);
- 5.增加子节点
root.AppendChild(node)
- 6.移除子节点
root.RemoveChild(node);
【root -> XmlElemen节点类】
if( File.Exists(path) ){//加载 newXml.Load(path);//移除XmlNode node;node = newXml.SelectSingleNode("Root/atk");//得到父节点XmlNode root2 = newXml.SelectSingleNode("Root");//移除子节点root2.RemoveChild(node);//添加节点XmlElement speed = newXml.CreateElement("moveSpeed");speed.InnerText = "20";root2.AppendChild(speed);//记得存newXml.Save(path);}
🎶(s) XML 练习
XML编写练习
当出现没有变量名的数据时 就用变量类型名命名
读取练习
//将一个和PlayerInfo相同信息的XML文件的值读取出来赋给另一个对象
public class Item
{public int id;public int num;
}public class PlayerInfo
{public string name;public int atk;public int def;public float moveSpeed;public float roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic;public void LoadData(string fileName){//加载XML文件信息XmlDocument xml = new XmlDocument();//加载xml.Load(Application.streamingAssetsPath + "/" + fileName + ".xml");//从文件中加载出具体的数据//加载根节点 才能加载后面的内容XmlNode playerInfo = xml.SelectSingleNode("PlayerInfo");//通过根节点 去加载具体的信息this.name = playerInfo.SelectSingleNode("name").InnerText;this.atk = int.Parse(playerInfo.SelectSingleNode("atk").InnerText);this.def = int.Parse(playerInfo.SelectSingleNode("def").InnerText);this.moveSpeed = float.Parse(playerInfo.SelectSingleNode("moveSpeed").InnerText);this.roundSpeed = float.Parse(playerInfo.SelectSingleNode("roundSpeed").InnerText);XmlNode weaponNode = playerInfo.SelectSingleNode("weapon");this.weapon = new Item();this.weapon.id = int.Parse(weaponNode.SelectSingleNode("id").InnerText);this.weapon.num = int.Parse(weaponNode.SelectSingleNode("num").InnerText);XmlNode listIntNode = playerInfo.SelectSingleNode("listInt");XmlNodeList intList = listIntNode.SelectNodes("int");this.listInt = new List<int>();for (int i = 0; i < intList.Count; i++){this.listInt.Add(int.Parse(intList[i].InnerText));}XmlNode itemList = playerInfo.SelectSingleNode("itemList");XmlNodeList items = itemList.SelectNodes("Item");this.itemList = new List<Item>();foreach (XmlNode item in items){Item item2 = new Item();item2.id = int.Parse(item.Attributes["id"].Value);item2.num = int.Parse(item.Attributes["num"].Value);this.itemList.Add(item2);}XmlNode itemDic = playerInfo.SelectSingleNode("itemDic");XmlNodeList keyInt = itemDic.SelectNodes("int");XmlNodeList valueItem = itemDic.SelectNodes("Item");this.itemDic = new Dictionary<int, Item>();for (int i = 0; i < keyInt.Count; i++){int key = int.Parse(keyInt[i].InnerText);Item value = new Item();value.id = int.Parse(valueItem[i].Attributes["id"].Value);value.num = int.Parse(valueItem[i].Attributes["num"].Value);this.itemDic.Add(key, value);}}
}
存取练习
//封装一个将信息存到一个XML文件中的方法public void SaveData(string fileName){//决定存储路径string path = Application.persistentDataPath + "/" + fileName + ".xml";Debug.Log(Application.persistentDataPath);//5个步骤//1.创建我们的Xml文本 XmlDocument xml = new XmlDocument();//2.添加固定内容XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");xml.AppendChild(xmlDec);//3.添加根节点XmlElement playerInfo = xml.CreateElement("PlayerInfo");xml.AppendChild(playerInfo);//4.添加子节点 或者 属性相关XmlElement name = xml.CreateElement("name");name.InnerText = this.name;playerInfo.AppendChild(name);XmlElement atk = xml.CreateElement("atk");atk.InnerText = this.atk.ToString();playerInfo.AppendChild(atk);XmlElement def = xml.CreateElement("def");def.InnerText = this.def.ToString();playerInfo.AppendChild(def);XmlElement moveSpeed = xml.CreateElement("moveSpeed");moveSpeed.InnerText = this.moveSpeed.ToString();playerInfo.AppendChild(moveSpeed);XmlElement roundSpeed = xml.CreateElement("roundSpeed");roundSpeed.InnerText = this.roundSpeed.ToString();playerInfo.AppendChild(roundSpeed);//weaponXmlElement weapon = xml.CreateElement("weapon");XmlElement id = xml.CreateElement("id");id.InnerText = this.weapon.id.ToString();weapon.AppendChild(id);XmlElement num = xml.CreateElement("num");num.InnerText = this.weapon.num.ToString();weapon.AppendChild(num);playerInfo.AppendChild(weapon);//listIntXmlElement listInt = xml.CreateElement("listInt");for (int i = 0; i < this.listInt.Count; i++){XmlElement intNode = xml.CreateElement("int");intNode.InnerText = this.listInt[i].ToString();listInt.AppendChild(intNode);}playerInfo.AppendChild(listInt);//itemListXmlElement itemList = xml.CreateElement("itemList");for (int i = 0; i < this.itemList.Count; i++){XmlElement itemNode = xml.CreateElement("Item");itemNode.SetAttribute("id", this.itemList[i].id.ToString());itemNode.SetAttribute("num", this.itemList[i].num.ToString());itemList.AppendChild(itemNode);}playerInfo.AppendChild(itemList);//itemDicXmlElement itemDic = xml.CreateElement("itemDic");foreach (int key in this.itemDic.Keys){//keyXmlElement intNode = xml.CreateElement("int");intNode.InnerText = key.ToString();itemDic.AppendChild(intNode);//valueXmlElement itemNode = xml.CreateElement("Item");itemNode.SetAttribute("id", this.itemDic[key].id.ToString());itemNode.SetAttribute("num", this.itemDic[key].num.ToString());itemDic.AppendChild(itemNode);}playerInfo.AppendChild(itemDic);//5.存储xml.Save(path);}
⭐🅰️⭐
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、
相关文章:

【unity数据持久化】XML数据管理器知识点
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...

Linux——Shell常用运算符
运算符说明举例-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 …...

C++(4)C++内存管理和命名空间
内存管理 new/delete C语言 malloc free完成对堆内存的申请和释放。 C new delete 类 new:动态申请存储空间的运算符,返回值为申请空间的对应数据类型的地址 int *p new int(10); 申请了一个初始值为10的整型数据 int *p new int[10]; 申…...

一网打尽java注解-克隆-面向对象设计原则-设计模式
文章目录 注解内置注解元注解 对象克隆为什么要克隆?如何克隆浅克隆深克隆 Java设计模式什么是设计模式?为什么要学习设计模式? 建模语言类接口类之间的关系依赖关系关联关系聚合关系组合关系继承关系实现关系 面向对象设计原则单一职责开闭原…...

k8s-statefulset部署myql-Nodeport方式
目录 1、部署openebs(Elastic Block Store) 1.下载镜像(针对k8s1.19) 2.加载镜像(所有节点包括master) 3.下载yaml文件并部署 4.设置默认storageclass 2、编写相关yaml文件 1.编写secret 2.编写state…...

MySQL双主架构、主从架构
为什么要对数据库做优化? MySQL官方说法: 单表2000万数据就达到瓶颈了。所以为了保证查询效率,要让每张表的大小得到控制。 MySQL主主架构 主数据库都负责增删改查。 比如有1000W的数据,有两个主数据库,就将数据分流给…...

基于微信小程序的物流管理系统3txar
在此基础上,结合现有物流管理体系的特点,运用新技术,构建了以 springboot为基础的物流信息化管理体系。首先,以需求为依据,对目前传统物流管理基础业务进行了较为详尽的了解和分析。根据需求分析结果进行了系统的设计&…...

Maven 一键部署到 SSH 服务器
简介 利用 Maven Mojo 功能一键部署 jar 包或 war 包到远程服务器上。 配置 在 maven 的setting.xml 配置服务器 SSH 账号密码。虽然可以在工程的 pom.xml 直接配置,但那样不太安全。 <servers><server><id>iq</id><configuration&…...

docker搭建owncloud,Harbor,构建镜像
1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 拉取镜像 docker pull owncloud docker pull mysql:5.6 2、安装搭建私有仓库 Harbor 1.下载docker-compose 2.安装harbor 3.编辑 harbor.yml文件 使用./intall.sh安装 4.登录 3、编写Dockerfile制作Web应用系…...

RISC-V(1)——RISC-V是什么,有什么用
目录 1. RISC-V是什么 2. RISC-V指令集 3. RISC-V特权架构 4. RiscV的寄存器描述 5. 指令 5.1 算数运算—add/sub/addi/mul/div/rem 5.2 逻辑运算—and/andi/or/ori/xor/xori 5.3 位移运算—sll/slli/srl/srli/sra/srai 5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw …...

基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码
基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.黄金正弦优化BP神经网络2.1 BP神经网络参数设置2.2 黄金正弦算法应用 4.测试结果:5…...

Python标准库概览
Python标准库概览 知识点 标准库: turtle库(必选)标准库: random库(必选)、time库(可选) 知识导图 1、turtle库概述 turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制。turtle库绘制图形有一个基本框架&#x…...

两个列表的最小索引总和
题目: 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺…...

Go语言基础之切片
切片 切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合 切片的定义…...

关于java三元组的问题
在改代码的时候,发现一个奇怪的地方,举例如下 Testpublic void buildTest(){TT t new TT();Long time tnull?System.currentTimeMillis():t.getTime();System.out.println("done");}Datapublic static class TT{Long time;}这个地方运行就…...

如何正确地设置Outlook SMTP发送电子邮件(wordpress配置)
如何正确地设置Outlook SMTP发送电子邮件(wordpress配置) 作者:虚坏叔叔 博客:https://pay.xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 正在寻找正确的Outlook SMTP设置?…...

机器学习编译系列---张量程序抽象
机器学习编译系列---张量程序抽象 1. 张量函数概念的引入与抽象的必要性 1. 张量函数概念的引入与抽象的必要性 在文章机器学习编译系列—概述中提到,机器学习编译的一个很重要操作是做等价变换来减少内存或者提高运行效率。变换是以“元张量函数”(private tensor …...

python使用matplotlib实现折线图的绘制
一、意义 数据可视化可以以简洁的方式呈现出数据,发现众多数据中隐藏的规律和意义。Matplotlib是一个数学绘图库。利用它可以制作简单的图表(散点图、折线图)。然后,将基于漫步概念生成一个更有趣的数据集–根据一系列随机决策生成…...

网络协议的定义、组成和重要性?
什么是网络协议? 网络协议是在计算机网络中,用于规定通信实体之间进行数据传输和通信的规则集合。网络协议涵盖了各种通信细节,包括数据包格式、错误处理、数据传输速率等,是用于分组交换数据网络的一种协议,其任务仅…...

vue 使用print.js打印小票
官网:https://printjs.crabbly.com/ // 安装 npm install print-js --save// 引入 import printJS from print-js// 使用 printJS({printable: https://hwke.tbbug.com/images/phone/1899ed9346f64020ff4f9bbae6983952.jpg,type: image,imageStyle: width:100%;ma…...

算法通关村第6关【白银】| 树的层次遍历问题
一、基本层次遍历问题 1.二叉树的层次遍历 思路:使用队列可以很好的保存遍历状态,出队将结点左右子结点入队,用size记录下一层的元素个数,这样就能区分出层了 class Solution {public List<List<Integer>> levelOr…...

Qt与电脑管家3
1.ui页面设计技巧 最外面的widget: 上下左右的margin都置相同的值 这里有4个widget,做好一个后,后面3个可以直接复制.ui文件,然后进行微调即可。 2.现阶段实现的效果: 3.程序结构: btn1--->btn btn1---…...

Jmeter 快速生成测试报告
我们使用Jmeter工具进行接口测试或性能测试后一般是通过察看结果数、聚合报告等监听器来查看响应结果。如果要跟领导汇报测试结果,无法直接通过监听器的结果来进行展示和汇报,因为太low了,因此测试完成后去整理一个数据齐全且美观的报告是非常…...

消息队列——RabbitMQ(一)
MQ的相关概念 什么事mq MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中ÿ…...

人工智能在机器学习中的八大应用领域
文章目录 1. 自然语言处理(NLP)2. 图像识别与计算机视觉3. 医疗诊断与影像分析4. 金融风险管理5. 预测与推荐系统6. 制造业和物联网7. 能源管理与环境保护8. 决策支持与智能分析结论 🎉欢迎来到AIGC人工智能专栏~探索人工智能在机器学习中的八…...

vue3+ts使用vue-i18n
vue3ts使用vue-i18n 1、安装插件 npm install --save vue-i18nyarn add vue-i18n2、配置文件 locale/index.ts import { createI18n } from vue-i18n import zhCN from ./lang/zh-CN import enUS from ./lang/en-USexport const LOCALE_OPTIONS [{ label: 中文, value: zh…...

在Ubuntu上安装和设置RabbitMQ服务器,轻松实现外部远程访问
文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…...

Redis多机实现
Background 为啥要有多机--------------1.容错 2.从服务器分担读压力。 主从结构一大难题------------如何保障一致性,对这个一致性要求不是很高,因为redis是用来做缓存的 同时我们要自动化进行故障转移-------哨兵机制,同时哨兵也可能cra…...

ClickHouse安装及部署
文章目录 Docker快速安装Ubuntu预编译安装包安装检查是否支持SSE4.2使用预编译安装包 Tgz安装包配置文件修改修改密码配置远程访问 其他主机访问文章参考 Docker快速安装 本地pull镜像 docker run -d --name ch-server --ulimit nofile262144:262144 -p 9000:9000 -p 8123:81…...

[HarekazeCTF2019]Easy Notes-代码审计
文章目录 [HarekazeCTF2019]Easy Notes-代码审计 [HarekazeCTF2019]Easy Notes-代码审计 登录之后有几个功能点,可以添加节点,然后使用Export导出 我们查看源码, 我们发现想要拿到flag的条件时$_SESSION[admin]true 如果我们能够控制sessio…...