Unity XML2——C#读写XML
一、XML 文件的存放位置
(一)只读不写的 XML
放在 Resouces 或者 StreamingAssets 文件夹下,详见 Unity基础3——Resources资源动态加载_weixin_53163894的博客-CSDN博客。
(二)动态存储的 XML
放在 Application.persistentDataPath 路径下
二、C# 读取 XML
C# 读取 XML 的方法有几种
-
XmlDocument (把数据加载到内存中,方便读取)
-
XmlTextReader (以流形式加载,内存占用更少,但是是单向只读,使用不是特别方便,除非有特殊需求,否则不会使用)
-
Linq (以后专门讲 Linq 的时候讲)
使用 XmlDocument 类读取是较方便最容易理解和操作的方法
XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--TestXML.xml-->
<Root><name>xxx</name><age>18</age><Item id="1" num="10"/><Friend><name>小明</name><age>8</age></Friend><Friend><name>小红</name><age>10</age></Friend>
</Root>
(一)读取 xml 文件信息
using System.Xml;XmlDocument xml = new XmlDocument();// 通过XmlDocument读取xml文件 有两个API// 1.直接根据xml字符串内容 来加载xml文件
// 存放在Resorces文件夹下的xml文件加载处理
TextAsset asset = Resources.Load<TextAsset>("TestXml");
print(asset.text);
// 通过这个方法 就能够翻译字符串为xml对象
xml.LoadXml(asset.text);// 2.是通过xml文件的路径去进行加载
// 存放在StreamingAssets文件夹下的xml文件加载处理
xml.Load(Application.streamingAssetsPath + "/TestXml.xml");
(二)读取元素和属性信息
节点信息类:XmlNode 单个节点信息类
节点列表信息:XmlNodeList 多个节点信息类
// 获取xml当中的根节点
XmlNode root = xml.SelectSingleNode("Root");
// 再通过根节点 去获取下面的子节点
XmlNode nodeName = root.SelectSingleNode("name");
// 如果想要获取节点包裹的元素信息 直接 .InnerText
print(nodeName.InnerText);XmlNode nodeAge = root.SelectSingleNode("age");
print(nodeAge.InnerText);XmlNode nodeItem = root.SelectSingleNode("Item");
// 第一种方式 直接 中括号获取信息
print(nodeItem.Attributes["id"].Value);
print(nodeItem.Attributes["num"].Value);
// 第二种方式
print(nodeItem.Attributes.GetNamedItem("id").Value);
print(nodeItem.Attributes.GetNamedItem("num").Value);// 这里是获取 一个节点下的同名节点的方法
XmlNodeList friendList = root.SelectNodes("Friend");// 遍历方式一:迭代器遍历
foreach (XmlNode item in friendList)
{print(item.SelectSingleNode("name").InnerText);print(item.SelectSingleNode("age").InnerText);
}// 遍历方式二:通过for循环遍历
// 通过XmlNodeList中的 成员变量 Count可以得到 节点数量
for (int i = 0; i < friendList.Count; i++)
{print(friendList[i].SelectSingleNode("name").InnerText);print(friendList[i].SelectSingleNode("age").InnerText);
}
(三)总结
1.读取 XML 文件
XmlDocument xml = new XmlDocument();// 读取文本方式1-xml.LoadXml(传入xml文本字符串)
// 读取文本方式2-xml.Load(传入路径)
2.读取元素和属性
// 获取单个节点
XmlNode node = xml.SelectSingleNode(节点名);
// 获取多个节点
XmlNodeList nodeList = xml.SelectNodes(节点名);// 获取节点元素内容:node.InnerText
// 获取节点元素属性:
// 1.
item.Attributes["属性名"].Value;
// 2.
item.Attributes.GetNamedItem("属性名").Value;// 通过迭代器遍历或者循环遍历XmlNodeList对象 可以获取到各单个元素节点
三、C# 存储修改 XML
(一)决定存储在哪个文件夹下
注意:存储 xml 文件,在 Unity 中一定是使用各平台都可读可写可找到的路径
-
Resources 可读不可写,打包后找不到 ❌
-
Application.streamingAssetsPath 可读 PC 端可写 找得到 ❌
-
Application.dataPath 打包后找不到 ❌
-
Application.persistentDataPath 可读可写找得到 ✔️
string path = Application.persistentDataPath + "/PlayerInfo2.xml";
print(Application.persistentDataPath);
(二)存储 XML 文件
关键类 XmlDocument:用于创建节点 存储文件
关键类 XmlDeclaration:用于添加版本信息
关键类 XmlElement:节点类
存储有 5 步:
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.为根节点添加子节点
// 加了一个 name子节点
XmlElement name = xml.CreateElement("name");
name.InnerText = "xxx";
root.AppendChild(name);XmlElement atk = xml.CreateElement("atk");
atk.InnerText = "10";
root.AppendChild(atk);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);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);
5.保存
xml.Save(path);
(三)修改 XML 文件
using System.IO;// 1.先判断是否存在文件
if( File.Exists(path) )
{// 2.加载后 直接添加节点 移除节点即可XmlDocument newXml = new XmlDocument();newXml.Load(path);// 修改就是在原有文件基础上 去移除 或者添加// 移除// 这种是一种简便写法 通过 "/" 来区分父子关系XmlNode node = newXml.SelectSingleNode("Root/atk");// XmlNode node = newXml.SelectSingleNode("Root").SelectSingleNode("atk");// 得到自己的父节点XmlNode root2 = newXml.SelectSingleNode("Root");// 移除子节点方法root2.RemoveChild(node);// 直接删除自己// node.ParentNode.RemoveChild(node);// 添加节点XmlElement speed = newXml.CreateElement("moveSpeed");speed.InnerText = "20";root2.AppendChild(speed);// 改了记得存newXml.Save(path);
}相关文章:
Unity XML2——C#读写XML
一、XML 文件的存放位置 (一)只读不写的 XML 放在 Resouces 或者 StreamingAssets 文件夹下,详见 Unity基础3——Resources资源动态加载_weixin_53163894的博客-CSDN博客。 (二)动态存储的 XML 放在 Applica…...
带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)
带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库,编译出的库适合香橙派,这时候交叉编译可执行程序的平台和链接库的格式也是正确的,然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置,但是现在还没有学习过…...
数据仓库基础知识
什么是数据仓库? 数仓,DataWarehouse,是一个 面向主题的、集成的、稳定的、与时间相关的 数据集合。 而这个数据集合的建立,是为了支持管理者的决策过程。 也就是说,我们通过建设数仓,为业务中的流程改进、…...
M 芯片的 macos 系统安装虚拟机 centos7 网络配置
centos 安装之前把网络配置配好或者是把网线插好 第一步找到这个 第二步打开网络适配器 选择图中所指位置 设置好之后 开机启动 centos 第三步 开机以后 编写网卡文件保存 重启网卡就可以了,如果重启网卡不管用,则重启虚拟机即可 “ ifcfg-ens160 ” 这…...
AcWing 3708. 求矩阵的鞍点
输入样例: 3 4 1 2 3 4 1 2 3 4 1 2 3 4输出样例: 1 4 4 2 4 4 3 4 4 #include<bits/stdc.h> using namespace std; const int N1010; int n,m,a[N][N],x[N],y[N],flag1; int main(){scanf("%d%d",&n,&m);for(int i1;i<n;i…...
web前端开发工程师的具体职责范本(合集)
web前端开发工程师的具体职责范本1 职责: 1.负责web前端架构的搭建,核心业务功能开发和核心代码编写。 2.配合产品经理,实现产品UI和交互方面的需求,持续界面优化,提升用户体验。 3.参与相关业务需求变更评审。 4.…...
从源程序到可执行文件的四个过程
从源程序到可执行文件的四个过程 预处理编译汇编链接 程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接,如下图所示: -E选项:提示编译器执行完预处理就停下来,后边的编译、汇编、链接就先不执…...
C++部署学习
gcc -E src/main.c -o src/main.i gcc -S src/main.c -o src/main.s gcc -C src/main.c -o src/main.o gcc src/main.c -o exec ./exec...
linux下lazarus开发ide里 BGRAControls控件库comboBox示例
下载开发工具 ftp://ftp.freepascal.org/pub/lazarus/releases/Lazarus%20Linux%20amd64%20DEB/Lazarus%202.2.6/https://sourceforge.net/projects/lazarus/files/Lazarus%20Linux%20amd64%20DEB/Lazarus%202.2.6/ sourceforge下载可能比较慢,选择 下载有问题&…...
Redis学习路线(9)—— Redis的场景使用
默认做好了其它的前提,只专注于Redis使用 一、短信登录 在没有Redis数据库时,我们会基于Session实现登录(利用令牌进行授权),是怎么实现的呢? (一)基于Session的短信登录功能 1、…...
糟了,数据库主从延迟了!
前言 在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面 因此,一般来说都是通过集群主从复制(Master-Slave)的方式来同步数据&…...
VUE,子组件给父组件传递参数,props 自定义属性,ref
<template><div><!-- 子传父 --><!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据 --><AA :getAAname"getAAname"/><h1>AA:{{aaname}}</h1><!-- 通过父组件给子组件绑定一个自定…...
【Oracle系列】- Oracle数据迁移
【Oracle系列】- Oracle数据迁移 文章目录 【Oracle系列】- Oracle数据迁移一、概述二、数据迁移方案三、模拟迁移方案四、迁移步骤五、迁移方案及其实施细则5.1 exp/imp逻辑备份与恢复5.2 Storage存储迁移5.3 利用data guard迁移 一、概述 最近在做公司软件系统盘点时&#x…...
Linux环境安装MySQL(详细教程)
1、下载MySQL MySQL官网:MySQLhttps://www.mysql.com/ 下载社区版(免费,但不提供技术支持) 简单说明一下rpm和tar包的区别: tar 只是一种压缩文件格式,所以,它只是把文件压缩打包 rpm…...
23. Mysql中的排序规则
文章目录 Mysql中的排序规则1. 数据库默认的排序规则2. 查看表的排序规则2.1 查看表排序规则2.2 查看字段排序规则 3.修改排序规则3.1 修改库3.2 修改表3.3 修改字段 Mysql中的排序规则 1. 数据库默认的排序规则 mysql8的默认排序方式是 utf8mb4_0900_ai_ci mysql5的默认排序…...
MongoDB 基础学习记录
MongoDB 基础 mongoDB 是由 C语言编写,基于分布式文件存储的开源数据库系统,是一个 nosql 数据库. 在高负载的情况下,添加更多的节点,保证服务器性能,MongoDB 旨在为 web 引用提供可扩展的高性能存储解决方案,将数据存储为给文档, 数据结构由键值(key,value)对组成,MongoDB 文…...
Visual Studio2022报错 无法打开 源 文件 “openssl/conf.h“解决方式
目录 问题起因问题解决临时解决方案 问题起因 近一段时间有了解到Boost 1.82.0新添加了MySQL库,最近一直蠢蠢欲动想要试一下这个库 所以就下载了源码并进行了编译(过程比较简单,有文档的) 然后在VS2022中引入了Boost环境…...
【更新公告】Airtest更新至1.3.0.1版本
1. 前言 本次更新为Airtest库更新,版本提升至1.3.0.1版本,主要新增了一些iOS设备相关的装包等接口,以及封装了一些tidevice常用接口。更多更新详情,详见我们下文的描述。 2. 新增iOS设备接口 1)iOS安装接口…...
SQL语句集锦
题记:SQL语句就是一种编程语言,我们平时项目中我们需要从数据库种调取数据,然后通过增删改查的接口对数据库进行操作,当然我们也可以用数据库自己的编程语言进行数据库里边数据的操作。 1.select * from users; 从use…...
【多线程中的线程安全问题】线程互斥
1 🍑线程间的互斥相关背景概念🍑 先来看看一些基本概念: 1️⃣临界资源:多线程执行流共享的资源就叫做临界资源。2️⃣临界区:每个线程内部,访问临界资源的代码,就叫做临界区。3️⃣互斥&…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
