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

来源:互联网 发布:linux yum安装jdk1.8 编辑:程序博客网 时间:2024/05/03 02:57

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


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

using UnityEngine;using System.Collections;using System.Collections.Generic;using System.Xml;using System.IO;using System.Text;using LitJson;
1、生成XML

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!");}}
运行结果

<transforms>  <rotation id="0" name="momo">    <x>0</x>    <y>1</y>    <z id="1">2</z>  </rotation></transforms>

2.更新XML文件

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

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!");} }

运行结果

<transforms>  <rotation id="1000" name="momo">    <x>0</x>    <y>1</y>    <z id="1">update00000</z>  </rotation></transforms>

3.添加XML

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

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!");}}
运行结果

<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

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!");} }
运行结果

<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
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字符串显示字典键值

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字符串,先合成 然后在输出。

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://download.csdn.net/detail/e295166319/9664808
0 0
原创粉丝点击