C#合成解析XML与JSON

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

 

Unity3D研究院之使用 C#合成解析XML与JSON(四十一) - 雨松MOMO程序研究院 - 1

首先注意头文件,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);
 
		}
	}

  

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

Unity3D研究院之使用 C#合成解析XML与JSON(四十一) - 雨松MOMO程序研究院 - 2

 

接着是处理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"]);
		}
	}

  

运行结果

Unity3D研究院之使用 C#合成解析XML与JSON(四十一) - 雨松MOMO程序研究院 - 3

 

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

  

运行结果

Unity3D研究院之使用 C#合成解析XML与JSON(四十一) - 雨松MOMO程序研究院 - 4

 

 http://www.xuanyusong.com/archives/1901

转载 雨松MOMO 2012年11月29日 于 雨松MOMO程序研究院 发表

posted @ 2017-03-04 01:47  RONGWEIJUN  阅读(329)  评论(0编辑  收藏  举报