2013年9月16日 星期一

Unity3D研究院之使用 C#合成解析XML与JSON(四十一)

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

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

运行结果
雨松MOMO祝大家学习愉快,哈哈哈。