Unity3D 游戏引擎之使用 C#合成解析XML与JSON

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

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

双击代码全选
1
2
3
4
5
6
7
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
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
<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
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
<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
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
<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
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
<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
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
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
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祝大家学习愉快,哈哈哈。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值