zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    SharePoint 2019
    SharePoint 2019 图文安装教程
    SharePoint 2016 服务器部署(七)SharePoint 和OOS 集成
    如何将域中的AD数据导入SharePoint
    SharePoint 2016 图文安装教程 后面有激活序列号、密钥分享
    Github上优秀的.NET Core项目
    SQL Server删除/创建复制订阅失败,报15517错误问题的处理
    vue-devtools 开发工具的安装
    laravel 查询数据toArray内层无法转换的问题
    KindEditor 增加html标签
  • 原文地址:https://www.cnblogs.com/rongweijun/p/6499226.html
Copyright © 2011-2022 走看看