XML与JSON在开发中非常重要, 其实核心就是处理字符串。一个是XML的字符串一个是JSON的字符串,尤其是在处理网络请求的时候,肯定是要用的。另外现在JSON非常的流行,我写了一个简单的例子融合了XML与JSON的合成与解析,希望大家喜欢!
首先注意头文件,LitJson是处理JSON的第三方库,最后我会给出下载地址。
1 2 3 4 5 6 7 8 9 |
using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Xml; using System.IO; using System.Text; using LitJson; |
1、生成XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public void createXml() { //xml保存的路径,这里放在Assets路径 注意路径。 string filepath = Application.dataPath + @"/my.xml"; //继续判断当前路径下是否有该文件 if(!File.Exists (filepath)) { //创建XML文档实例 XmlDocument xmlDoc = new XmlDocument(); //创建root节点,也就是最上一层节点 XmlElement root = xmlDoc.CreateElement("transforms"); //继续创建下一层节点 XmlElement elmNew = xmlDoc.CreateElement("rotation"); //设置节点的两个属性 ID 和 NAME elmNew.SetAttribute("id","0"); elmNew.SetAttribute("name","momo"); //继续创建下一层节点 XmlElement rotation_X = xmlDoc.CreateElement("x"); //设置节点中的数值 rotation_X.InnerText = "0"; XmlElement rotation_Y = xmlDoc.CreateElement("y"); rotation_Y.InnerText = "1"; XmlElement rotation_Z = xmlDoc.CreateElement("z"); rotation_Z.InnerText = "2"; //这里在添加一个节点属性,用来区分。。 rotation_Z.SetAttribute("id","1"); //把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序 elmNew.AppendChild(rotation_X); elmNew.AppendChild(rotation_Y); elmNew.AppendChild(rotation_Z); root.AppendChild(elmNew); xmlDoc.AppendChild(root); //把XML文件保存至本地 xmlDoc.Save(filepath); Debug.Log("createXml OK!"); } } |
运行结果
1 2 3 4 5 6 7 8 9 |
<transforms> <rotation id="0" name="momo"> <x>0</x> <y>1</y> <z id="1">2</z> </rotation> </transforms> |
2.更新XML文件
以其中某个节点名称做条件,当查询到时更新该节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public void UpdateXml() { string filepath = Application.dataPath + @"/my.xml"; if(File.Exists (filepath)) { XmlDocument xmlDoc = new XmlDocument(); //根据路径将XML读取出来 xmlDoc.Load(filepath); //得到transforms下的所有子节点 XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes; //遍历所有子节点 foreach(XmlElement xe in nodeList) { //拿到节点中属性ID =0的节点 if(xe.GetAttribute("id")=="0") { //更新节点属性 xe.SetAttribute("id","1000"); //继续遍历 foreach(XmlElement x1 in xe.ChildNodes) { if(x1.Name=="z") { //这里是修改节点名称对应的数值,而上面的拿到节点连带的属性。。。 x1.InnerText="update00000"; } } break; } } xmlDoc.Save(filepath); Debug.Log("UpdateXml OK!"); } } |
运行结果
1 2 3 4 5 6 7 8 9 |
<transforms> <rotation id="1000" name="momo"> <x>0</x> <y>1</y> <z id="1">update00000</z> </rotation> </transforms> |
3.添加XML
重复的地方我就不解释拉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public void AddXml() { string filepath = Application.dataPath + @"/my.xml"; if(File.Exists (filepath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filepath); XmlNode root = xmlDoc.SelectSingleNode("transforms"); XmlElement elmNew = xmlDoc.CreateElement("rotation"); elmNew.SetAttribute("id","1"); elmNew.SetAttribute("name","yusong"); XmlElement rotation_X = xmlDoc.CreateElement("x"); rotation_X.InnerText = "0"; rotation_X.SetAttribute("id","1"); XmlElement rotation_Y = xmlDoc.CreateElement("y"); rotation_Y.InnerText = "1"; XmlElement rotation_Z = xmlDoc.CreateElement("z"); rotation_Z.InnerText = "2"; elmNew.AppendChild(rotation_X); elmNew.AppendChild(rotation_Y); elmNew.AppendChild(rotation_Z); root.AppendChild(elmNew); xmlDoc.AppendChild(root); xmlDoc.Save(filepath); Debug.Log("AddXml OK!"); } } |
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<transforms> <rotation id="1000" name="momo"> <x>0</x> <y>1</y> <z id="1">update00000</z> </rotation> <rotation id="1" name="yusong"> <x id="1">0</x> <y>1</y> <z>2</z> </rotation> </transforms> |
4.删除XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public void deleteXml() { string filepath = Application.dataPath + @"/my.xml"; if(File.Exists (filepath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filepath); XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes; foreach(XmlElement xe in nodeList) { if(xe.GetAttribute("id")=="1") { xe.RemoveAttribute("id"); } foreach(XmlElement x1 in xe.ChildNodes) { if(x1.Name == "z") { x1.RemoveAll(); } } } xmlDoc.Save(filepath); Debug.Log("deleteXml OK!"); } } |
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<transforms> <rotation id="1000" name="momo"> <x>0</x> <y>1</y> <z> </z> </rotation> <rotation name="yusong"> <x id="1">0</x> <y>1</y> <z> </z> </rotation> </transforms> |
4.解析与输出上面的XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public void showXml() { string filepath = Application.dataPath + @"/my.xml"; if(File.Exists (filepath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filepath); XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes; //遍历每一个节点,拿节点的属性以及节点的内容 foreach(XmlElement xe in nodeList) { Debug.Log("Attribute :" + xe.GetAttribute("name")); Debug.Log("NAME :" + xe.Name); foreach(XmlElement x1 in xe.ChildNodes) { if(x1.Name == "y") { Debug.Log("VALUE :" + x1.InnerText); } } } Debug.Log("all = " + xmlDoc.OuterXml); } } |
运行结果(点击图片最大化)
接着是处理JSON
5.解析JSON字符串显示字典键值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public void ResolveJson() { //定义的JSON字符串,注意JSON的格式 string str = @" { ""Name"" : ""yusong"", ""Age"" : 26, ""Birthday"" : ""1986-11-21"", ""Thumbnail"":[ { ""Url"": ""http://xuanyusong.com"", ""Height"": 256, ""Width"": ""200"" }, { ""Url"": ""http://baidu.com"", ""Height"": 1024, ""Width"": ""500"" } ] }"; //这里是解析,包括整形与字符串 JsonData jd = JsonMapper.ToObject(str); Debug.Log("name = " + (string)jd["Name"]); Debug.Log("Age = " + (int)jd["Age"]); Debug.Log("Birthday = " + (string)jd["Birthday"]); JsonData jdItems = jd["Thumbnail"]; for (int i = 0; i < jdItems.Count; i++) { Debug.Log("URL = " + jdItems[i]["Url"]); Debug.Log("Height = " + (int)jdItems[i]["Height"]); Debug.Log("Width = " + jdItems[i]["Width"]); } } |
运行结果
6.合成JSON字符串,先合成 然后在输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public void MergerJson() { StringBuilder sb = new StringBuilder (); JsonWriter writer = new JsonWriter (sb); writer.WriteObjectStart (); writer.WritePropertyName ("Name"); writer.Write ("yusong"); writer.WritePropertyName ("Age"); writer.Write (26); writer.WritePropertyName ("Girl"); writer.WriteArrayStart (); writer.WriteObjectStart(); writer.WritePropertyName("name"); writer.Write("ruoruo"); writer.WritePropertyName("age"); writer.Write(24); writer.WriteObjectEnd (); writer.WriteObjectStart(); writer.WritePropertyName("name"); writer.Write("momo"); writer.WritePropertyName("age"); writer.Write(26); writer.WriteObjectEnd (); writer.WriteArrayEnd(); writer.WriteObjectEnd (); Debug.Log(sb.ToString ()); JsonData jd = JsonMapper.ToObject(sb.ToString ()); Debug.Log("name = " + (string)jd["Name"]); Debug.Log("Age = " + (int)jd["Age"]); JsonData jdItems = jd["Girl"]; for (int i = 0; i < jdItems.Count; i++) { Debug.Log("Girl name = " + jdItems[i]["name"]); Debug.Log("Girl age = " + (int)jdItems[i]["age"]); } } |
运行结果
工程下载: http://vdisk.weibo.com/s/jkBml
雨松MOMO祝大家学习愉快,哈哈哈。
- 本文固定链接: https://www.xuanyusong.com/archives/1901
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
foreach(XmlElement xe in nodeList)报错
InvalidCastException: Cannot cast from source type to destination type.
比如上面的例子中,”Age”为”26″,如何将其赋给一个float型的age。当我进行如下处理时:Debug(“Age = ” + (float)jd[“Age”]);,就没有输出结果
您好!请问这样都是得到了字符串,假如是将一个float的数字用json写,如何解析?我遇到了“cannot convert JsonData to float ” 的问题,利用(float)进行强制类型转换,程序就好像阻塞了。谢谢!
很详细,学到了不少~非常感谢~
看大神的文章学习了很多,非常感谢!
LitJson不是说对ios不兼容吗 大大有没有啥好的解决方法
非常希望可以加个QQ好友 我们一起学习unity3D 一起深究
上面有我的联系方式。
万分感谢!工作不小心出现这个问题,感谢你的提示!
大神帮我解决了大问题 感谢!但是解析JSON中文乱码怎么办?感谢!
请问下,如果我一个节点有子节点,同时也有值,我怎么只访问这个节点的值啊?用InnerText的话会把子节点的值也一起输出来
节点里的值指的是Attaibute吗?节点的Attributes属性可以访问属性值。
可 是,在这篇文章中用的是数据库,现在的问题是XML 在android中读写不了, 好长时间了,求帮忙!!!!
litjson不支持中文啊,怎么破
别用litjson~~ 在IOS上有问题。。
用minijson?
可以用序列化。。 ScriptableObject 我现在都是用这个做的。。
雨松大神,你帮我解决了好多问题,谢谢啊!
松大,问个问题,在WEB中如何读取XML呢,能系统的讲一下嘛,因为我查文档说datapathweb中没有实际文件名,如何去读取呢。
foreach(XmlElement xe in nodeList)XmlElement是XmlNode的子类的子类;为神马子类可以引用父类?