一、前言

这篇文章,早在游戏蛮牛的专栏里就写过,一直在使用这个工具,稍微修改了下。在我们的项目中经常会用到XML来存储一些工程中的设置,而对XML的操作无非就是增删改查四个操作,代码虽然不多,但是使用到的时候确实方便。

二、实现

 代码如下:

using UnityEngine;
using System.Collections;
using System.Linq;
using System.Xml.Linq;
using System;public class Global_XMLCtr
{private static Global_XMLCtr _Instance;/// <summary>/// 安卓的SD卡绝对路径,另需要设置发布时候SD卡壳读写/// </summary>private static string xmlpath = String.Empty;public static Global_XMLCtr M_Instance{get{if (_Instance == null){
#if UNITY_ANDROID xmlpath= "file:///storage/emulated/0" + "/ResourcesData/XML/GlobalSetXML";#elif UNITY_STANDALONE_WIN || UNITY_EDITORxmlpath = M_CurProjectAssetPath + "ResourcesData/XML/GlobalSetXML";
#endif_Instance = new Global_XMLCtr();}return _Instance;}}public void CreateXMLDocument(){XElement root = new XElement("XMLContent");root.Save(xmlpath);}public bool CheckXMLISNull(){XElement root = null;try{root = XElement.Load(xmlpath);}catch (Exception ex){if (ex != null)return true;}return false;}public XElement LoadXMLFromFile(){XElement root = XElement.Load(xmlpath);return root;}public void SetElementValue(string name, string value){XElement root = LoadXMLFromFile();root.Element(name).SetValue(value);root.Save(xmlpath);}/// <summary>/// 在根节点元素之前添加新的元素/// </summary>/// <param name="name">元素名字</param>/// <param name="value">元素的值</param>public void AddElement(string name, string value){XElement root = LoadXMLFromFile();XElement newElement = new XElement(name, value);root.Add(newElement);root.Save(xmlpath);}/// <summary>/// 删除指定的元素/// </summary>/// <param name="name">要删除的元素名称</param>public void RemoveElement(string name){XElement root = LoadXMLFromFile();root.Element(name).Remove();root.Save(xmlpath);}/// <summary>/// 根据元素名查找元素对应的值/// </summary>/// <param name="name">元素名</param>/// <returns></returns>public string GetElementValue(string name){XElement root = LoadXMLFromFile();//     XAttribute xattr = root.Element(name.Trim()).Attribute("MyVaule");XElement curElement = root.Element(name.Trim());string s = curElement.Value;return s;}/// <summary>/// 检测这个元素是否存在,不存在为True/// </summary>/// <param name="name"></param>/// <returns></returns>public bool CheckElementIsNull(string name){XElement root = LoadXMLFromFile();XElement xElement = root.Element(name);//XMl的元素名不能以数字开头return xElement == null ? true : false;}
}

使用LinqXML执行是会有延迟的,新增加的元素在一个方法里面是不会立马读出来的,因为XML的操作都是延迟执行的。

如果要使用加密版本的,代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Security.AccessControl;
using System.Xml;
using System.Xml.Serialization;public class LinqToXMLAndEncrypt
{static string dataKey = SystemInfo.deviceUniqueIdentifier;//设置秘钥,根据平台而定//static string xmlpath = Application.persistentDataPath + @"\myXML";//平台相关的路径(移动端)static string xmlpath = Application.dataPath + @"\myXML";//电脑上的路径,移动端没有这个访问权限/// <summary>/// 初始化一个XML文件/// </summary>public static void CreateXMLDocument(){XElement root = new XElement("XMLContent",new XElement("IsFirstPlayGame", new XAttribute("MyVaule", "0")),new XElement("Herb1", new XAttribute("MyVaule", "0")),new XElement("Herb2", new XAttribute("MyVaule", "0")),new XElement("Herb3", new XAttribute("MyVaule", "0")),new XElement("Level01", new XAttribute("MyVaule", "0")),/*从level01到LevelDemo是用来表示这个关卡是否玩过,其中MyVaule=1表示玩过,0表示没有*/new XElement("Level02", new XAttribute("MyVaule", "0")),new XElement("Level03", new XAttribute("MyVaule", "0")),new XElement("Level04", new XAttribute("MyVaule", "0")),new XElement("Level05", new XAttribute("MyVaule", "0")),new XElement("Level06", new XAttribute("MyVaule", "0")),new XElement("LevelDemo", new XAttribute("MyVaule", "0")),new XElement("Level", new XAttribute("MyVaule", "0")),new XElement("Root", "root"));root.Save(xmlpath);EncrtyptSaveXML();}private static void  EncrtyptSaveXML(){StreamReader sReader = File.OpenText(xmlpath);string xmlData = sReader.ReadToEnd();sReader.Close();string xxx = Encrypt(xmlData);StreamWriter writer;writer = File.CreateText(xmlpath);writer.Write(xxx);writer.Close();}public static XElement DecrtyptLoadXML(){if (hasFile(xmlpath)){StreamReader sReader = File.OpenText(xmlpath);string xmlData = sReader.ReadToEnd();sReader.Close();string xxx = Decrypt(xmlData);StreamWriter writer;writer = File.CreateText(xmlpath);writer.Write(xxx);writer.Close();XElement root = XElement.Load(xmlpath);return root;}elsereturn null;}public static void SetElementValue(string name, string value){XElement root = DecrtyptLoadXML();root.Element(name).SetAttributeValue("MyVaule", value);root.Save(xmlpath);EncrtyptSaveXML();}/// <summary>/// 在根节点元素之前添加新的元素/// </summary>/// <param name="name">元素名字</param>/// <param name="value">元素的值</param>public static void AddElement(string name, string value){XElement root = DecrtyptLoadXML();root.Element("Root").AddBeforeSelf(new XElement(name, new XAttribute("MyValue", value)));root.Save(xmlpath);EncrtyptSaveXML();}/// <summary>/// 删除指定的元素/// </summary>/// <param name="name">要删除的元素名称</param>public static void RemoveElement(string name){XElement root = DecrtyptLoadXML();root.Element(name).Remove();root.Save(xmlpath);EncrtyptSaveXML();}/// <summary>/// 根据元素名查找元素对应的值/// </summary>/// <param name="name">元素名</param>/// <returns></returns>public static string GetElementValue(string name){XElement root = DecrtyptLoadXML();XAttribute xattr = root.Element(name).Attribute("MyVaule");string s = xattr.Value;EncrtyptSaveXML();return s;}/// <summary>/// 内容加密,加密和解密采用相同的key,具体可以自己定义,条件是必须是32位的/// </summary>/// <param name="toE"></param>/// <returns></returns>private static  string Encrypt(string toE){byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.Mode = CipherMode.ECB;rDel.Padding = PaddingMode.PKCS7;ICryptoTransform cTransform = rDel.CreateEncryptor();byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);}/// <summary>/// 内容解密,千万记住解密和加密采用相同的key,必须是32位/// </summary>/// <param name="toD"></param>/// <returns></returns>private static  string Decrypt(string toD){//加密和解密采用相同的key,具体值自己填,但是必须为32位//byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.Mode = CipherMode.ECB;rDel.Padding = PaddingMode.PKCS7;ICryptoTransform cTransform = rDel.CreateDecryptor();byte[] toEncryptArray = Convert.FromBase64String(toD);byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return UTF8Encoding.UTF8.GetString(resultArray);}/// <summary>/// 判断XML文档是否存在/// </summary>/// <param name="fileName"></param>/// <returns></returns>public static bool hasFile(string fileName){return File.Exists(fileName);}/// <summary>/// 读取XML,返回XML的字符串/// </summary>/// <returns>返回XML的一串字符</returns>public static  string LoadXMLForString(bool isDecrypt=true){if (hasFile(xmlpath)){StreamReader sReader = File.OpenText(xmlpath);string dataString = sReader.ReadToEnd();sReader.Close();if (isDecrypt){string xxx = Decrypt(dataString);return xxx;}else return dataString;}else{return null;}}
}

代码同样是包含了基本的增删改查四个基本操作,但是对于每一个操作都是有加密和解密处理,代码并没有做优化,反复的加密和解密是个不足之处。

三、总结

1、XML的读写执行有延迟处理的机制;

2、反复加密和解密处理XML并不是很理想的操作。

Unity实用小工具或脚本——XML工具相关推荐

  1. Unity实用小工具或脚本—以对象方式访问MySql数据库

    一.前言         以对象方式处理MySql数据库顾名思义就是可以将每个数据库表作为一个类,没一条数据作为一个对象来进行操作,大致思路和我上一篇文章类似,这里不再赘述.文章后有资源下载地址,所使 ...

  2. Unity实用小工具或脚本——读写Json工具

    一.前言       在Unity中读写Json文件已经有非常好的工具,可以将Json文件和结构体数据进行相互转换,如图1所示,在Unity Asset Store中搜JSON.NET可以找到该插件, ...

  3. Unity实用小工具或脚本——可折叠伸缩的多级(至少三级)内容列表(类似于Unity的Hierarchy视图中的折叠效果)

    目录 一.前言 二.实现 2.1.创建ScrollView 2.2.制作层级预设体BaseLevelPartObj 2.3.设置该预设体的初始化处理方法 2.4.读取Hierarchy的内容并创建UI ...

  4. Unity实用小工具或脚本——可折叠伸缩的多级列表二(带搜索功能)

    一.前言 继上篇可折叠伸缩的多级(至少三级)内容列表实现了类似于Unity的Unity的Hierarchy视图中的折叠效果之后,我寻思的丰富一下该工具的功能,不保证说完全的复制Unity的Hierar ...

  5. Unity实用小工具或脚本——录屏工具

    一.前言 本文要讲的录屏不是使用Unity自带的那个截屏方法,因为unity自带的都只能截取unity程序本身显示的画面内容,至于unity程序之外的内容,如电脑桌面上的其他的程序内容是无法录屏的.本 ...

  6. Unity实用小工具或脚本—3D炫酷UI篇(一)

    一.前言 最近做AR和VR的项目,经常需要用到3D的UI,特意将最近自己捣鼓的这个UI的东西写下来.效果如图所示:主要的动画和素材也是借鉴了 第三方的插件"HoloUIExample&quo ...

  7. Unity实用小工具或脚本——智能包住任意多个物体的碰撞体

    一.前言 有些模型是我们在Unity中进行组合得到的一个模块,这个时候不可能再让美术给加碰撞体,需要用代码智能给其加碰撞体,如图1所示:任意的多个物体组成的一个综合物体最后都可以给它加上合适的碰撞体, ...

  8. Unity实用小工具或脚本——3D物体带坐标轴的拖拽

    一.前言 我们最近要做一个线路的规划编辑,并且是在三维场景中,编辑完就立马能用.立马能用还好说,有特别多的轮子可以用,在三维场景中实时编辑就有点意思了.其实功能就是类似于在Unity的编辑界面操作一个 ...

  9. Unity实用小工具—以对象形式操作Sqlite

    一.介绍 1.1.版本说明:使用的Unity版本为个人版2020.3.39,数据库为Sqlite(一个轻量级跨平台数据库),Sqlite的查看管理工具可以在网上下载https://dbeaver.io ...

最新文章

  1. 新晋小白怎样才能做好seo优化
  2. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 自定义控件过渡绘制 | 布局文件层次深 | GPU 过渡绘制调试工具 | 背景过度绘制 )
  3. “你的手机上未安装应用程序”的解决方案
  4. Marketing Cloud里Odata请求响应结构的解析
  5. 使用SAP CRM WebClient UI Design layer修改field label
  6. 电商风靡2020的C4D立体感海报设计,psd分层模板来了。
  7. win7 apache php mysql 配置64,win7 64位 Apache+php+mysql配置方法
  8. POJ 1716 Integer Intervals
  9. 参数调整 新部署rac_CDH5部署三部曲之三:问题总结
  10. 逻辑卷管理和磁盘配额
  11. mysql jar包下载(直接链接下载)
  12. Python 上传文件到阿里云OSS
  13. ContactsProvider2
  14. 用人话说说希尔伯特空间??
  15. 互联网晚报 | 12月9日 星期四 | 微博正式登陆港交所;OPPO官宣首款自研芯片即将发布;腾讯启动“技术公益创投计划”...
  16. 怎么将PDF文件转换成Word文档?
  17. TypeScript基础入门之Symbols
  18. exploit-db图文教程
  19. pythonapi是什么意思_API是什么意思?API文档又是什么意思?
  20. Unity打包的PC项目生成一个EXE文件

热门文章

  1. 视频教程-Linux视频教程-Linux
  2. Debian与Ubuntu到底有什么不同,应该如何选择?
  3. 远程缝制葡萄皮,成本仅1万元,华为200万年薪博士杰作
  4. 研究记录02—EKF_SLAM ——2012.4 Joan Sola
  5. 我做的 地税信息中心设备台账
  6. 阿里云总裁王文彬谈阿里云未来三个定位
  7. Linux嵌入式开发——vim编辑器
  8. Redis配置不当致使root被提权漏洞
  9. C++中set容器的基本使用----在B站听黑马程序员c++课程的记录
  10. 读研期间发84篇SCI!研究生被怀疑有“背景”和学术造假,本人回应!