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️⃣互斥&…...
Go Web中间件机制深度剖析与实战
Go Web中间件机制深度剖析与实战 引言 中间件(Middleware)是Web开发中的核心概念,它在请求处理链路中扮演着至关重要的角色。本文将深入探讨Go语言中中间件的实现机制,并通过实战案例展示如何构建可复用的中间件系统。 一、中间件…...
DeepSeek服务网格选型决策树(Istio vs. eBPF轻量方案深度对比:延迟压降42%、资源开销降低68%实测数据)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek微服务架构建议 在构建面向大语言模型推理与训练任务的微服务系统时,DeepSeek系列模型对计算密集型服务、高吞吐API网关及弹性资源编排提出了明确要求。推荐采用分层解耦、异步协同…...
星火动漫 × 火山引擎:用Seedance重构创作链路加速释放AI漫剧生产力
20 天能做什么?在传统动漫制作的管线里,这点时间或许只够画完一套分镜稿。但就是在这短短 20 天内,一部名为《西游:五指山上贴瓷砖》的漫剧不仅完成了全流程制作,更一路杀出重围,连续多日霸榜。若按常规路径…...
三国杀卡牌DIY终极指南:5分钟打造你的专属武将
三国杀卡牌DIY终极指南:5分钟打造你的专属武将 【免费下载链接】Lyciumaker 在线三国杀卡牌制作器 项目地址: https://gitcode.com/gh_mirrors/ly/Lyciumaker 还在羡慕别人能设计出酷炫的三国杀武将卡牌吗?Lyciumaker这个免费开源的三国杀卡牌制作…...
从日志Bug到状态机设计:我的C++ TinyWebServer调试日记与性能优化思考
从日志Bug到状态机设计:我的C TinyWebServer调试日记与性能优化思考 深夜的显示器前,咖啡杯早已见底。当我第三次在TinyWebServer的日志中看到"用户注册成功"的消息延迟出现在下一个请求时,那种如鲠在喉的感觉让我意识到࿱…...
HAMi:面向云原生AI基础设施的异构计算统一管理平台
HAMi:面向云原生AI基础设施的异构计算统一管理平台 【免费下载链接】HAMi Heterogeneous GPU Sharing on Kubernetes 项目地址: https://gitcode.com/GitHub_Trending/ha/HAMi 随着AI工作负载在Kubernetes集群中的大规模部署,异构计算资源管理已成…...
OpenClaw 用户通过 Taotoken 快速接入并启用 Agent 工作流
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 OpenClaw 用户通过 Taotoken 快速接入并启用 Agent 工作流 对于使用 OpenClaw 框架构建 AI Agent 的开发者而言,能够灵…...
Windows Server TLS安全加固:注册表三步禁用Sweet32漏洞
1. 这不是“打补丁”,而是给Windows Server的SSL/TLS协议栈做一次外科手术你有没有遇到过这样的情况:安全扫描工具突然报出一堆红色高危漏洞,CVE-2016-2183(Sweet32)、CVE-2015-2808(Logjam)、C…...
如何快速修复损坏的QR码:QrazyBox终极指南
如何快速修复损坏的QR码:QrazyBox终极指南 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾遇到过打印的二维码被咖啡渍污染,或者手机拍摄的二维码模糊不清&…...
Zephyr GPIO API 深度解析:从设备树到代码
GPIO 是嵌入式开发中最基础、最频繁打交道的外设。点灯、读按键、控制继电器、触发中断……几乎每一个项目都是从 GPIO 开始的。理解 Zephyr 的 GPIO API 设计,也就理解了 Zephyr 驱动模型的核心哲学:用设备树描述"接在哪",用统一 …...
