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://vdisk.weibo.com/s/jkBml
雨松MOMO祝大家学习愉快,哈哈哈。
- 本文固定链接: https://www.xuanyusong.com/archives/1901
- 转载请注明: 雨松MOMO于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!





我觉得这个教程应该先把目标xml文件输出出来, 这样更可以让读者更直观的观察xml结构
谢谢啦。。
总有些大神 带领我们脱贫致富 ,挥泪感谢中….
呵呵。。
大神看了你的帖子学了很多。挥泪再次感谢中
看了受益匪浅啊。不愧是大神。
真是给力啊
添加XML那一节中,为什么最后要xmlDoc.AppendChild(root);,觉得多余
想起了tinyxml
哈哈。。
工程文件打不开呢,你用的是什么版本啊?
哭了~用editplus打开脚文件->另存为->选择编码(右下脚)用utf-8 bom->保存。原来脚本的格式是utf-8没有bom
哭了~用editplus打开脚文件->另存为->选择编码(右下脚)用utf-8+bom->保存。原来脚本的格式是utf-8没有bom
好吧, 你在WIndows上开发吧的? 不好意思我没在windows上开发过。。
为啥中文会变乱码呢。。。 x1.InnerText=”你好”;写到xml后变 “浣犲ソ” 啦~
格式问题吧??
ios 设备上面 litjson 库的jsonmapper 方法无法使用有什么比较好的支持移动设备的json库吗
就用我文章中说的这个就可以。。
ios 设备上面 JsonMapper方法无法使用
不好意思啊 江南 我也没用过JsonMapper···········
急求,如果在android下读取xml,路径应该怎么样?
https://www.xuanyusong.com/archives/1454 第三方数据库的路径 就是拷贝的
雨松老师非常经典支持支持!!
感谢支持哈。。。。。
你好,我刚刚看到你的消息,我很震惊,我也很不明白!我是引用Unity3D官方的角色控制器组件。何来抄袭呢?再说我文章中已经说过这是角色控制器。所以我很费解!打开Unity3D 在Project视图 import Package -> Character Controller 载入角色控制器组件,即可看到Unity官方提供的脚本 ThirdPersonController 和 ThirdPersonCamera 脚本我不明白为什么你说这是你的?莫非你是Unity官方的程序员?我的QQ289187120 邮箱 xuanyusong@gmail.com 希望你能给我一个合理的解释。谢谢!
string filepath = Application.dataPath “/Raw” “/house1.xml”; 写成这样就可以了。。
大侠,问一下,如果我在ios下面读取xml,应该放在那个文件夹下面?
放在这里StreamingAssets
Application.dataPath + “/StreamingAssets/” + “house1.xml”,我写成这样子,不好用呢
string filepath = Application.dataPath +”/Raw”+”/house1.xml”; 写成这样就可以了。。
看了您的另一篇文章搞定了
看您的文章受益很多啊
感谢支持 蛤蛤。。 一起学习一起进步吧。。啦啦啦
Application.dataPath “/StreamingAssets/” “house1.xml”,我写成这样子,不好用呢
彪悍的人生需要MO嫂大力支持!
彪悍的人生不需要解释,,给力!给力! 给力!!!