Unity3D之使用 C#合成解析XML与JSON

XML与JSON在开发中非常重要, 其实核心就是处理字符串。一个是XML的字符串一个是JSON的字符串,尤其是在处理网络请求的时候,肯定是要用的。另外现在JSON非常的流行,我写了一个简单的例子融合了XML与JSON的合成与解析,希望大家喜欢!

 

首先注意头文件,LitJson是处理JSON的第三方库,最后我会给出下载地址。

1 using UnityEngine;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Xml;
5 using System.IO;
6 using System.Text;
7 using LitJson;

 

 

1、生成XML

01 public void createXml()
02 {
03            //xml保存的路径,这里放在Assets路径 注意路径。
04     string filepath = Application.dataPath + @"/my.xml";
05            //继续判断当前路径下是否有该文件
06     if(!File.Exists (filepath))
07     {
08                      //创建XML文档实例
09          XmlDocument xmlDoc = new XmlDocument();
10                      //创建root节点,也就是最上一层节点
11          XmlElement root = xmlDoc.CreateElement("transforms");
12                       //继续创建下一层节点
13          XmlElement elmNew = xmlDoc.CreateElement("rotation");
14                     //设置节点的两个属性 ID 和 NAME
15          elmNew.SetAttribute("id","0");
16          elmNew.SetAttribute("name","momo");
17            //继续创建下一层节点
18              XmlElement rotation_X = xmlDoc.CreateElement("x");
19                  //设置节点中的数值
20                  rotation_X.InnerText = "0";
21                 XmlElement rotation_Y = xmlDoc.CreateElement("y");
22                 rotation_Y.InnerText = "1";
23                 XmlElement rotation_Z = xmlDoc.CreateElement("z");
24                  rotation_Z.InnerText = "2";
25                 //这里在添加一个节点属性,用来区分。。
26        rotation_Z.SetAttribute("id","1");
27  
28          //把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序
29          elmNew.AppendChild(rotation_X);
30          elmNew.AppendChild(rotation_Y);
31          elmNew.AppendChild(rotation_Z);
32      root.AppendChild(elmNew);
33          xmlDoc.AppendChild(root);
34          //把XML文件保存至本地
35          xmlDoc.Save(filepath);
36          Debug.Log("createXml OK!");
37     }
38 }

 

运行结果

1 <transforms>
2   <rotation id="0" name="momo">
3     <x>0</x>
4     <y>1</y>
5     <z id="1">2</z>
6   </rotation>
7 </transforms>

 

2.更新XML文件

以其中某个节点名称做条件,当查询到时更新该节点

01 public void UpdateXml()
02 {
03     string filepath = Application.dataPath + @"/my.xml";
04     if(File.Exists (filepath))
05     {
06          XmlDocument xmlDoc = new XmlDocument();
07                      //根据路径将XML读取出来
08          xmlDoc.Load(filepath);
09                      //得到transforms下的所有子节点
10          XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes;
11                      //遍历所有子节点
12          foreach(XmlElement xe in nodeList)
13          {
14                             //拿到节点中属性ID =0的节点
15             if(xe.GetAttribute("id")=="0")
16             {
17                                     //更新节点属性
18                 xe.SetAttribute("id","1000");
19                                     //继续遍历
20                 foreach(XmlElement x1 in xe.ChildNodes)
21                 {
22                     if(x1.Name=="z")
23                     {
24                                                     //这里是修改节点名称对应的数值,而上面的拿到节点连带的属性。。。
25                          x1.InnerText="update00000";
26                     }
27  
28                 }
29                 break;
30             }
31          }
32          xmlDoc.Save(filepath);
33          Debug.Log("UpdateXml OK!");
34     }
35  
36 }

 

运行结果

1 <transforms>
2   <rotation id="1000" name="momo">
3     <x>0</x>
4     <y>1</y>
5     <z id="1">update00000</z>
6   </rotation>
7 </transforms>

 

3.添加XML

重复的地方我就不解释拉。

01 public void AddXml()
02 {
03     string filepath = Application.dataPath + @"/my.xml";
04     if(File.Exists (filepath))
05     {
06         XmlDocument xmlDoc = new XmlDocument();
07         xmlDoc.Load(filepath);
08         XmlNode root = xmlDoc.SelectSingleNode("transforms");
09         XmlElement elmNew = xmlDoc.CreateElement("rotation");
10         elmNew.SetAttribute("id","1");
11         elmNew.SetAttribute("name","yusong");
12  
13          XmlElement rotation_X = xmlDoc.CreateElement("x");
14          rotation_X.InnerText = "0";
15          rotation_X.SetAttribute("id","1");
16          XmlElement rotation_Y = xmlDoc.CreateElement("y");
17          rotation_Y.InnerText = "1";
18          XmlElement rotation_Z = xmlDoc.CreateElement("z");
19          rotation_Z.InnerText = "2";
20  
21          elmNew.AppendChild(rotation_X);
22          elmNew.AppendChild(rotation_Y);
23          elmNew.AppendChild(rotation_Z);
24          root.AppendChild(elmNew);
25          xmlDoc.AppendChild(root);
26          xmlDoc.Save(filepath);
27          Debug.Log("AddXml OK!");
28     }
29 }

 

运行结果

01 <transforms>
02   <rotation id="1000" name="momo">
03     <x>0</x>
04     <y>1</y>
05     <z id="1">update00000</z>
06   </rotation>
07   <rotation id="1" name="yusong">
08     <x id="1">0</x>
09     <y>1</y>
10     <z>2</z>
11   </rotation>
12 </transforms>

 

4.删除XML

01 public void deleteXml()
02 {
03     string filepath = Application.dataPath + @"/my.xml";
04     if(File.Exists (filepath))
05     {
06          XmlDocument xmlDoc = new XmlDocument();
07          xmlDoc.Load(filepath);
08          XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes;
09          foreach(XmlElement xe in nodeList)
10          {
11             if(xe.GetAttribute("id")=="1")
12             {
13                 xe.RemoveAttribute("id");
14             }
15  
16             foreach(XmlElement x1 in xe.ChildNodes)
17             {
18                 if(x1.Name == "z")
19                 {
20                     x1.RemoveAll();
21  
22                 }
23             }
24          }
25          xmlDoc.Save(filepath);
26          Debug.Log("deleteXml OK!");
27     }
28  
29 }

 

运行结果

01 <transforms>
02   <rotation id="1000" name="momo">
03     <x>0</x>
04     <y>1</y>
05     <z>
06     </z>
07   </rotation>
08   <rotation name="yusong">
09     <x id="1">0</x>
10     <y>1</y>
11     <z>
12     </z>
13   </rotation>
14 </transforms>

 

4.解析与输出上面的XML

01 public void showXml()
02 {
03     string filepath = Application.dataPath + @"/my.xml";
04     if(File.Exists (filepath))
05     {
06          XmlDocument xmlDoc = new XmlDocument();
07          xmlDoc.Load(filepath);
08          XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes;
09         //遍历每一个节点,拿节点的属性以及节点的内容
10          foreach(XmlElement xe in nodeList)
11          {
12             Debug.Log("Attribute :" + xe.GetAttribute("name"));
13             Debug.Log("NAME :" + xe.Name);
14             foreach(XmlElement x1 in xe.ChildNodes)
15             {
16                 if(x1.Name == "y")
17                 {
18                     Debug.Log("VALUE :" + x1.InnerText);
19  
20                 }
21             }
22          }
23          Debug.Log("all = " + xmlDoc.OuterXml);
24  
25     }
26 }

 

运行结果(点击图片最大化)

 

接着是处理JSON

5.解析JSON字符串显示字典键值

01 public void ResolveJson()
02 {
03              //定义的JSON字符串,注意JSON的格式
04      string str = @"
05         {
06             ""Name""     : ""yusong"",
07             ""Age""      : 26,
08             ""Birthday"" : ""1986-11-21"",
09             ""Thumbnail"":[
10             {
11                 ""Url"":    ""http://xuanyusong.com"",
12                 ""Height"": 256,
13                 ""Width"":  ""200""
14             },
15             {
16                 ""Url"":    ""http://baidu.com"",
17                 ""Height"": 1024,
18                 ""Width"":  ""500""
19             }
20  
21             ]
22         }";
23     //这里是解析,包括整形与字符串
24     JsonData jd = JsonMapper.ToObject(str);
25     Debug.Log("name = " + (string)jd["Name"]);
26     Debug.Log("Age = " + (int)jd["Age"]);
27     Debug.Log("Birthday = " + (string)jd["Birthday"]);
28     JsonData jdItems = jd["Thumbnail"];
29  
30     for (int i = 0; i < jdItems.Count; i++)
31     {
32         Debug.Log("URL = " + jdItems[i]["Url"]);
33         Debug.Log("Height = " + (int)jdItems[i]["Height"]);
34         Debug.Log("Width = " + jdItems[i]["Width"]);
35     }
36 }

 

运行结果

 

6.合成JSON字符串,先合成 然后在输出。

01 public void MergerJson()
02 {
03     StringBuilder sb = new StringBuilder ();
04     JsonWriter writer = new JsonWriter (sb);
05  
06     writer.WriteObjectStart ();
07  
08     writer.WritePropertyName ("Name");
09     writer.Write ("yusong");
10  
11     writer.WritePropertyName ("Age");
12     writer.Write (26);
13  
14     writer.WritePropertyName ("Girl");
15  
16     writer.WriteArrayStart ();
17  
18     writer.WriteObjectStart();
19     writer.WritePropertyName("name");
20     writer.Write("ruoruo");
21     writer.WritePropertyName("age");
22     writer.Write(24);
23     writer.WriteObjectEnd ();
24  
25     writer.WriteObjectStart();
26     writer.WritePropertyName("name");
27     writer.Write("momo");
28     writer.WritePropertyName("age");
29     writer.Write(26);
30     writer.WriteObjectEnd ();
31  
32     writer.WriteArrayEnd();
33  
34     writer.WriteObjectEnd ();
35     Debug.Log(sb.ToString ());
36  
37     JsonData jd = JsonMapper.ToObject(sb.ToString ());
38     Debug.Log("name = " + (string)jd["Name"]);
39     Debug.Log("Age = " + (int)jd["Age"]);
40     JsonData jdItems = jd["Girl"];
41     for (int i = 0; i < jdItems.Count; i++)
42     {
43         Debug.Log("Girl name = " + jdItems[i]["name"]);
44         Debug.Log("Girl age = " + (int)jdItems[i]["age"]);
45     }
46 }

 

运行结果



Json 解析用的 LitJson的第三方类库,直接把下载的 .dll文件放入到 pluging 的文件夹下,然后 using LitJson;即可以调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值