Unity 配置文件XML,JSON的学习应用
原文链接:http://blog.csdn.net/y1196645376/article/details/52541882
修改更正:AdvancePikachu
最近在学热更新,涉及到资源热更,所以就了解了XML,JSON相关的东西。这方面网上资料还是比较多的,所以这里主要是总结一下基本使用方法和一些应用的Demo。
1.先介绍一下 XML 和 JSON 是什么东西吧?
(1)XML
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
(2)Json
JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, javascript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。
说了那么多,其实就是数据的两种保存格式。主要用于配置文件,描述数据,存储数据,数据传输等等。
2.因为Xml和Json都可以办到这些事情,那么它们之间有什么区别么?各自的优缺点?
(1)XML
优点:格式统一,符合标准;.容易与其他系统进行远程交互,数据共享比较方便。
缺点:XML文件庞大,文件格式复杂,传输占带宽;服务器端和客户端解析XML花费较多的资源和时间;需要花费大量代码来解析XML;
(2)Json
优点:数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;.支持多种语言;
缺点:可读性较xml略差;
总而言之,两者可以相互转换,功能都是相差无几的。但是json比xml较好,但xml更加通用。
3.XML使用的简单介绍.
a.先来看一段简单的xml代码。
<team name="Dreamer"> <student> <name>Tom</name> <age>20</age> <id>20111234</id> </student> <student> <name>Shierly</name> <age>19</age> <id>20113210</id> </student> <student> <name>Lili</name> <age>21</age> <id>20111110</id> </student> </team>
很显然,可以看出来,这段代码描述的是一个名叫Dreamer的团队有三个成员,还分别记录了这三个成员的相关信息。所以可以看出来XML的可读性十分强。所以我们可以用XML去描述 我们代码中的一些数据关系,描述一个对象。这也就是将对象序列化。然后使用的地方再将xml文件解析出来重新组成原来的对象,这就实现了复杂数据的传输。
public void CreateXML() { //xml保存的路径,注意路径。 string filepath = "E:/my.xml"; //继续判断当前路径下是否有该文件 if(!File.Exists (filepath)) { //创建XML文档实例 XmlDocument xmlDoc = new XmlDocument(); //创建root节点,也就是最上一层节点 XmlElement root = xmlDoc.CreateElement("team"); root.SetAttribute("name", "Dreamer"); //继续创建下一层节点 XmlElement student = xmlDoc.CreateElement("student"); //继续创建下一层节点 XmlElement name = xmlDoc.CreateElement("name"); //设置节点中的数值 name.InnerText = "Tom"; XmlElement age = xmlDoc.CreateElement("age"); age.InnerText = "20"; XmlElement id = xmlDoc.CreateElement("id"); id.InnerText = "20111234"; //把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序 student.AppendChild(name); student.AppendChild(age); student.AppendChild(id); root.AppendChild(student); student = xmlDoc.CreateElement("student"); name = xmlDoc.CreateElement("name"); name.InnerText = "Shierly"; age = xmlDoc.CreateElement("age"); age.InnerText = "19"; id = xmlDoc.CreateElement("id"); id.InnerText = "20113210"; student.AppendChild(name); student.AppendChild(age); student.AppendChild(id); root.AppendChild(student); student = xmlDoc.CreateElement("student"); name = xmlDoc.CreateElement("name"); name.InnerText = "Lili"; age = xmlDoc.CreateElement("age"); age.InnerText = "21"; id = xmlDoc.CreateElement("id"); id.InnerText = "20111110"; student.AppendChild(name); student.AppendChild(age); student.AppendChild(id); root.AppendChild(student); xmlDoc.AppendChild(root); //把XML文件保存至本地 xmlDoc.Save(filepath); } }
public void UpdateXml() { string filepath = "E:/my.xml"; if (File.Exists(filepath)) { XmlDocument xmlDoc = new XmlDocument(); //根据路径将XML读取出来 xmlDoc.Load(filepath); //得到team下的所有student节点. XmlNodeList studentlist = xmlDoc.SelectSingleNode("team").ChildNodes; //遍历所有子节点 foreach (XmlElement student in studentlist) { XmlNode name = student.SelectSingleNode("name"); if (name.InnerText.Equals("Lili")) { name.InnerText = "Jack"; } } xmlDoc.Save(filepath); } }
<team name="Dreamer"> <student> <name>Tom</name> <age>20</age> <id>20111234</id> </student> <student> <name>Shierly</name> <age>19</age> <id>20113210</id> </student> <student> <name>Jack</name> <age>21</age> <id>20111110</id> </student> </team>
d.添加xml属性( 增加一个学生:Sharo,22,20112312 )
public void InsertXml() { string filepath = "E:/my.xml"; if (File.Exists(filepath)) { XmlDocument xmlDoc = new XmlDocument(); //根据路径将XML读取出来 xmlDoc.Load(filepath); XmlNode team = xmlDoc.SelectSingleNode("team"); XmlElement newstudent = xmlDoc.CreateElement("student"); XmlElement name = xmlDoc.CreateElement("name"); name.InnerText = "Sharo"; XmlElement age = xmlDoc.CreateElement("age"); age.InnerText = "22"; XmlElement id = xmlDoc.CreateElement("id"); id.InnerText = "20112312"; //向新队员添加属性 newstudent.AppendChild(name); newstudent.AppendChild(age); newstudent.AppendChild(id); //将新队员添加到团队里面 team.AppendChild(newstudent); xmlDoc.Save(filepath); } }
<team name="Dreamer"> <student> <name>Tom</name> <age>20</age> <id>20111234</id> </student> <student> <name>Shierly</name> <age>19</age> <id>20113210</id> </student> <student> <name>Jack</name> <age>21</age> <id>20111110</id> </student> <student> <name>Sharo</name> <age>22</age> <id>20112312</id> </student> </team>
e.删除xml节点(删除Tom学生的信息)
public void DeleteXml() { string filepath = "E:/my.xml"; if (File.Exists(filepath)) { XmlDocument xmlDoc = new XmlDocument(); //根据路径将XML读取出来 xmlDoc.Load(filepath); XmlNode team = xmlDoc.SelectSingleNode("team"); XmlNodeList studentlist = team.ChildNodes; foreach(XmlNode student in studentlist) { XmlNode name = student.SelectSingleNode("name"); if(name.InnerText.Equals("Tom")) { team.RemoveChild(student); } } xmlDoc.Save(filepath); } }
Ps:上述的删除方法,原文博主的迭代器代码有误,本人更改为:
1 XmlNode[] reslt= studentlist.Case<XmlNode>().Where((node)=>{return node["name"].InnerText.Equals("Tom");}).ToArray();
<team name="Dreamer"> <student> <name>Shierly</name> <age>19</age> <id>20113210</id> </student> <student> <name>Jack</name> <age>21</age> <id>20111110</id> </student> <student> <name>Sharo</name> <age>22</age> <id>20112312</id> </student> </team>
f.解析xml文件
public void LoadXml() { string filepath = "E:/my.xml"; if (File.Exists(filepath)) { XmlDocument xmlDoc = new XmlDocument(); //根据路径将XML读取出来 xmlDoc.Load(filepath); XmlElement team = (XmlElement)xmlDoc.SelectSingleNode("team"); string teamname = team.GetAttribute("name"); Debug.Log("这是一个名叫" + teamname + "的队伍:"); XmlNodeList studentlist = team.ChildNodes; Debug.Log("一共有" + studentlist.Count + "人"); foreach (XmlNode student in studentlist) { XmlNode name = student.SelectSingleNode("name"); XmlNode age = student.SelectSingleNode("age"); XmlNode id = student.SelectSingleNode("id"); Debug.Log("姓名:" + name.InnerText + ",年龄:" + age.InnerText + ",学号:" + id.InnerText); } xmlDoc.Save(filepath); } }
这是一个名叫"Dreamer"的队伍: 一共有3人 姓名:Shierly,年龄:19,学号:20113210 姓名:Jack,年龄:21,学号:20111110 姓名:Sharo,年龄:22,学号:20112312
1 { 2 "Name" : "Dreamer", 3 "Number" : 3, 4 "Member" : 5 [ 6 { 7 "Name" : "Tom", 8 "Age" : 20, 9 "Id" : "20111234" 10 }, 11 { 12 "Name" : "Jack", 13 "Age" : 22, 14 "Id" : "20112312" 15 } 16 ] 17 }
1 public void CreateJson() 2 { 3 string path = "E:/json.txt"; 4 FileInfo t = new FileInfo(path); 5 6 StreamWriter sw = t.CreateText(); 7 8 StringBuilder sb = new StringBuilder(); 9 JsonWriter writer = new JsonWriter(sb); 10 //相当于写下了'{' 11 writer.WriteObjectStart(); 12 //相当于写下了"Name": 13 writer.WritePropertyName("Name"); 14 //相当于写下了"Dreamer" 15 writer.Write("Dreamer"); 16 17 writer.WritePropertyName("Number"); 18 writer.Write("3"); 19 20 writer.WritePropertyName("Member"); 21 //相当于写下了'[' 22 writer.WriteArrayStart(); 23 24 writer.WriteObjectStart(); 25 writer.WritePropertyName("Name"); 26 writer.Write("Tom"); 27 writer.WritePropertyName("Age"); 28 writer.Write("20"); 29 writer.WritePropertyName("Id"); 30 writer.Write("20111234"); 31 //相当于写下了'}' 32 writer.WriteObjectEnd(); 33 34 writer.WriteObjectStart(); 35 writer.WritePropertyName("Name"); 36 writer.Write("Jack"); 37 writer.WritePropertyName("Age"); 38 writer.Write("22"); 39 writer.WritePropertyName("Id"); 40 writer.Write("20112312"); 41 writer.WriteObjectEnd(); 42 //相当于写下了']' 43 writer.WriteArrayEnd(); 44 writer.WriteObjectEnd(); 45 sw.WriteLine(sb.ToString()); 46 sw.Close(); 47 }
1 using UnityEngine; 2 using LitJson; 3 public class A 4 { 5 public string name = "yzl"; 6 public int old = 20; 7 } 8 public class Test : MonoBehaviour 9 { 10 void Start() 11 { 12 A a = new A(); 13 Debug.Log(JsonMapper.ToJson(a)); 14 } 15 }
1 using UnityEngine; 2 using System.Collections; 3 using System; 4 using System.Collections.Generic; 5 using LitJson; 6 using System.IO; 7 public class Test : MonoBehaviour 8 { 9 void Start() 10 { 11 StreamReader sr = File.OpenText("E:/json.txt"); 12 string strline = sr.ReadToEnd(); 13 14 JsonData jd = JsonMapper.ToObject(strline); 15 16 //修改队名 17 jd["Name"] = "Winer"; 18 //添加队伍地址属性 19 jd["Address"] = "Sichuan"; 20 //删除队伍人数属性 21 ((IDictionary)jd).Remove("Number"); 22 Debug.Log(jd.ToJson()); 23 24 sr.Close(); 25 } 26 }
1 using UnityEngine; 2 using System.Collections; 3 using System; 4 using System.Collections.Generic; 5 using LitJson; 6 using System.IO; 7 8 public class Test : MonoBehaviour 9 { 10 void Start() 11 { 12 StreamReader sr = File.OpenText("E:/json.txt"); 13 string strline = sr.ReadToEnd(); 14 15 JsonData jd = JsonMapper.ToObject(strline); 16 17 Debug.Log("队伍名:" + jd["Name"]); 18 Debug.Log("队伍人数:" + jd["Number"]); 19 20 for (int i = 0; i < jd["Member"].Count; i++) 21 { 22 Debug.Log("姓名:" + jd["Member"][i]["Name"] + ",年龄:" + jd["Member"][i]["Age"] + ",学号:" + jd["Member"][i]["Id"]); 23 } 24 sr.Close(); 25 } 26 }
输出结果:
1 队伍名:Dreamer 2 队伍人数:3 3 姓名:Tom,年龄:20,学号:20111234 4 姓名:Jack,年龄:22,学号:20112312