尊重原创,转载请注明出处,谢谢!
http://blog.csdn.net/y1196645376/article/details/52541882
最近在学热更新,涉及到资源热更,所以就了解了XML,JSON相关的东西。这方面网上资料还是比较多的,所以这里主要是总结一下基本使用方法和一些应用的Demo。
1.先介绍一下 XML 和 JSON 是什么东西吧?
(1)XML
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
(2)Json
JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。
说了那么多,其实就是数据的两种保存格式。主要用于配置文件,描述数据,存储数据,数据传输等等。
2.因为Xml和Json都可以办到这些事情,那么它们之间有什么区别么?各自的优缺点?
(1)XML
优点:格式统一,符合标准;.容易与其他系统进行远程交互,数据共享比较方便。
缺点:XML文件庞大,文件格式复杂,传输占带宽;服务器端和客户端解析XML花费较多的资源和时间;需要花费大量代码来解析XML;
(2)Json
优点:数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;.支持多种语言;
缺点:可读性较xml略差;
总而言之,两者可以相互转换,功能都是相差无几的。但是json比xml较好,但xml更加通用。
a.先来看一段简单的xml代码。
-
<team name="Dreamer">
-
<student>
-
<name>Tom
</name>
-
<age>20
</age>
-
<id>20111234
</id>
-
</student>
-
<student>
-
<name>Shierly
</name>
-
<age>19
</age>
-
<id>20113210
</id>
-
</student>
-
<student>
-
<name>Lili
</name>
-
<age>21
</age>
-
<id>20111110
</id>
-
</student>
-
</team>
很显然,可以看出来,这段代码描述的是一个名叫Dreamer的团队有三个成员,还分别记录了这三个成员的相关信息。所以可以看出来XML的可读性十分强。所以我们可以用XML去描述 我们代码中的一些数据关系,描述一个对象。这也就是将对象序列化。然后使用的地方再将xml文件解析出来重新组成原来的对象,这就实现了复杂数据的传输。
-
public void CreateXML()
-
{
-
-
//xml保存的路径,注意路径。
-
string filepath =
"E:/my.xml";
-
//继续判断当前路径下是否有该文件
-
if(!File.Exists (filepath))
-
{
-
//创建XML文档实例
-
XmlDocument xmlDoc =
new XmlDocument();
-
//创建root节点,也就是最上一层节点
-
XmlElement root = xmlDoc.CreateElement(
"team");
-
root.SetAttribute(
"name",
"Dreamer");
-
//继续创建下一层节点
-
XmlElement student = xmlDoc.CreateElement(
"student");
-
-
//继续创建下一层节点
-
XmlElement name = xmlDoc.CreateElement(
"name");
-
//设置节点中的数值
-
name.InnerText =
"Tom";
-
XmlElement age = xmlDoc.CreateElement(
"age");
-
age.InnerText =
"20";
-
XmlElement id = xmlDoc.CreateElement(
"id");
-
id.InnerText =
"20111234";
-
-
//把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序
-
student.AppendChild(name);
-
student.AppendChild(age);
-
student.AppendChild(id);
-
root.AppendChild(student);
-
-
student = xmlDoc.CreateElement(
"student");
-
name = xmlDoc.CreateElement(
"name");
-
name.InnerText =
"Shierly";
-
age = xmlDoc.CreateElement(
"age");
-
age.InnerText =
"19";
-
id = xmlDoc.CreateElement(
"id");
-
id.InnerText =
"20113210";
-
student.AppendChild(name);
-
student.AppendChild(age);
-
student.AppendChild(id);
-
root.AppendChild(student);
-
-
student = xmlDoc.CreateElement(
"student");
-
name = xmlDoc.CreateElement(
"name");
-
name.InnerText =
"Lili";
-
age = xmlDoc.CreateElement(
"age");
-
age.InnerText =
"21";
-
id = xmlDoc.CreateElement(
"id");
-
id.InnerText =
"20111110";
-
student.AppendChild(name);
-
student.AppendChild(age);
-
student.AppendChild(id);
-
root.AppendChild(student);
-
-
xmlDoc.AppendChild(root);
-
//把XML文件保存至本地
-
xmlDoc.Save(filepath);
-
}
-
-
}
这个代码运行后就会在目标文件夹中生成一个xml文件而文件内容就是1中的那段xml代码。
-
public void UpdateXml()
-
{
-
string filepath =
"E:/my.xml";
-
if (File.Exists(filepath))
-
{
-
XmlDocument xmlDoc =
new XmlDocument();
-
//根据路径将XML读取出来
-
xmlDoc.Load(filepath);
-
//得到team下的所有student节点.
-
XmlNodeList studentlist = xmlDoc.SelectSingleNode(
"team").ChildNodes;
-
//遍历所有子节点
-
foreach (XmlElement student
in studentlist)
-
{
-
-
XmlNode name = student.SelectSingleNode(
"name");
-
if (name.InnerText.Equals(
"Lili"))
-
{
-
name.InnerText =
"Jack";
-
}
-
}
-
xmlDoc.Save(filepath);
-
}
-
}
请注意:
xmlelement.SelectSingleNode(name)是选取该节点下第一个子节点中名字为name的节点。必须是父子,不能隔两级及以上。
-
<team name="Dreamer">
-
<student>
-
<name>Tom
</name>
-
<age>20
</age>
-
<id>20111234
</id>
-
</student>
-
<student>
-
<name>Shierly
</name>
-
<age>19
</age>
-
<id>20113210
</id>
-
</student>
-
<student>
-
<name>Jack
</name>
-
<age>21
</age>
-
<id>20111110
</id>
-
</student>
-
</team>
d.添加xml属性
( 增加一个学生:Sharo,22,20112312 )
-
public void InsertXml()
-
{
-
string filepath =
"E:/my.xml";
-
if (File.Exists(filepath))
-
{
-
XmlDocument xmlDoc =
new XmlDocument();
-
//根据路径将XML读取出来
-
xmlDoc.Load(filepath);
-
-
XmlNode team = xmlDoc.SelectSingleNode(
"team");
-
XmlElement newstudent = xmlDoc.CreateElement(
"student");
-
-
XmlElement name = xmlDoc.CreateElement(
"name");
-
name.InnerText =
"Sharo";
-
-
XmlElement age = xmlDoc.CreateElement(
"age");
-
age.InnerText =
"22";
-
-
XmlElement id = xmlDoc.CreateElement(
"id");
-
id.InnerText =
"20112312";
-
//向新队员添加属性
-
newstudent.AppendChild(name);
-
newstudent.AppendChild(age);
-
newstudent.AppendChild(id);
-
//将新队员添加到团队里面
-
team.AppendChild(newstudent);
-
-
xmlDoc.Save(filepath);
-
}
-
}
上述代码演示了添加节点,其实对节点添加属性也是一样的。
-
<team name="Dreamer">
-
<student>
-
<name>Tom
</name>
-
<age>20
</age>
-
<id>20111234
</id>
-
</student>
-
<student>
-
<name>Shierly
</name>
-
<age>19
</age>
-
<id>20113210
</id>
-
</student>
-
<student>
-
<name>Jack
</name>
-
<age>21
</age>
-
<id>20111110
</id>
-
</student>
-
<student>
-
<name>Sharo
</name>
-
<age>22
</age>
-
<id>20112312
</id>
-
</student>
-
</team>
e.删除xml节点(删除Tom学生的信息)
-
public void DeleteXml()
-
{
-
string filepath =
"E:/my.xml";
-
if (File.Exists(filepath))
-
{
-
XmlDocument xmlDoc =
new XmlDocument();
-
//根据路径将XML读取出来
-
xmlDoc.Load(filepath);
-
-
XmlNode team = xmlDoc.SelectSingleNode(
"team");
-
XmlNodeList studentlist = team.ChildNodes;
-
-
foreach(XmlNode student
in studentlist)
-
{
-
XmlNode name = student.SelectSingleNode(
"name");
-
if(name.InnerText.Equals(
"Tom"))
-
{
-
team.RemoveChild(student);
-
}
-
}
-
-
xmlDoc.Save(filepath);
-
}
-
}
可以使用 xmlelement.RemoveAll() 删除所有子节点
-
<team name="Dreamer">
-
<student>
-
<name>Shierly
</name>
-
<age>19
</age>
-
<id>20113210
</id>
-
</student>
-
<student>
-
<name>Jack
</name>
-
<age>21
</age>
-
<id>20111110
</id>
-
</student>
-
<student>
-
<name>Sharo
</name>
-
<age>22
</age>
-
<id>20112312
</id>
-
</student>
-
</team>
-
public void LoadXml()
-
{
-
string filepath =
"E:/my.xml";
-
if (File.Exists(filepath))
-
{
-
XmlDocument xmlDoc =
new XmlDocument();
-
//根据路径将XML读取出来
-
xmlDoc.Load(filepath);
-
-
XmlElement team = (XmlElement)xmlDoc.SelectSingleNode(
"team");
-
string teamname = team.GetAttribute(
"name");
-
-
Console.WriteLine(
"这是一个名叫\"" + teamname +
"\"的队伍:");
-
XmlNodeList studentlist = team.ChildNodes;
-
Console.WriteLine(
"一共有" + studentlist.Count +
"人");
-
foreach (XmlNode student
in studentlist)
-
{
-
XmlNode name = student.SelectSingleNode(
"name");
-
XmlNode age = student.SelectSingleNode(
"age");
-
XmlNode id = student.SelectSingleNode(
"id");
-
Console.WriteLine(
"姓名:" + name.InnerText +
",年龄:" + age.InnerText +
",学号:" + id.InnerText);
-
}
-
-
xmlDoc.Save(filepath);
-
}
-
}
在实际情况中,我们一般在解析xml的时候去给对象相关属性赋值。相当于是在还原xml中表示的对象数据。
-
这是一个名叫
"Dreamer"的队伍:
-
一共有
3人
-
姓名:Shierly,年龄:
19,学号:
20113210
-
姓名:Jack,年龄:
21,学号:
20111110
-
姓名:Sharo,年龄:
22,学号:
20112312
恩这个描述看起来比较熟悉?没错,这就是键值对的表现方式。相比起xml来说json省略了很多冗余的表达格式。
{ "Name" : "Dreamer", "Number" : 3, "Member" : [ { "Name" : "Tom", "Age" : 20, "Id" : "20111234" }, { "Name" : "Jack", "Age" : 22, "Id" : "20112312" } ] }
-
public void CreateJson()
-
{
-
string path =
"E:/json.txt";
-
FileInfo t =
new FileInfo(path);
-
-
StreamWriter sw = t.CreateText();
-
-
StringBuilder sb =
new StringBuilder();
-
JsonWriter writer =
new JsonWriter(sb);
-
//相当于写下了'{'
-
writer.WriteObjectStart();
-
//相当于写下了"Name":
-
writer.WritePropertyName(
"Name");
-
//相当于写下了"Dreamer"
-
writer.Write(
"Dreamer");
-
-
writer.WritePropertyName(
"Number");
-
writer.Write(
"3");
-
-
writer.WritePropertyName(
"Member");
-
//相当于写下了'['
-
writer.WriteArrayStart();
-
-
writer.WriteObjectStart();
-
writer.WritePropertyName(
"Name");
-
writer.Write(
"Tom");
-
writer.WritePropertyName(
"Age");
-
writer.Write(
"20");
-
writer.WritePropertyName(
"Id");
-
writer.Write(
"20111234");
-
//相当于写下了'}'
-
writer.WriteObjectEnd();
-
-
writer.WriteObjectStart();
-
writer.WritePropertyName(
"Name");
-
writer.Write(
"Jack");
-
writer.WritePropertyName(
"Age");
-
writer.Write(
"22");
-
writer.WritePropertyName(
"Id");
-
writer.Write(
"20112312");
-
writer.WriteObjectEnd();
-
//相当于写下了']'
-
writer.WriteArrayEnd();
-
writer.WriteObjectEnd();
-
sw.WriteLine(sb.ToString());
-
sw.Close();
-
}
-
using UnityEngine;
-
using LitJson;
-
public
class
A
-
{
-
public
string name =
"yzl";
-
public
int old =
20;
-
}
-
public
class
Test :
MonoBehaviour
-
{
-
void Start()
-
{
-
A a =
new A();
-
Debug.Log(JsonMapper.ToJson(a));
-
}
-
}
观察控制台输出:{"name":"yzl","old":20}
-
using UnityEngine;
-
using System.Collections;
-
using System;
-
using System.Collections.Generic;
-
using LitJson;
-
using System.IO;
-
public
class
Test :
MonoBehaviour
-
{
-
void Start()
-
{
-
StreamReader sr = File.OpenText(
"E:/json.txt");
-
string strline = sr.ReadToEnd();
-
-
JsonData jd = JsonMapper.ToObject(strline);
-
-
//修改队名
-
jd[
"Name"] =
"Winer";
-
//添加队伍地址属性
-
jd[
"Address"] =
"Sichuan";
-
//删除队伍人数属性
-
((IDictionary)jd).Remove(
"Number");
-
Debug.Log(jd.ToJson());
-
-
sr.Close();
-
}
-
}
可以看出来json使用起来要比xml方便许多,解析的使用方法和C#的字典类似。
-
using UnityEngine;
-
using System.Collections;
-
using System;
-
using System.Collections.Generic;
-
using LitJson;
-
using System.IO;
-
-
public
class
Test :
MonoBehaviour
-
{
-
void Start()
-
{
-
StreamReader sr = File.OpenText(
"E:/json.txt");
-
string strline = sr.ReadToEnd();
-
-
JsonData jd = JsonMapper.ToObject(strline);
-
-
Debug.Log(
"队伍名:" + jd[
"Name"]);
-
Debug.Log(
"队伍人数:" + jd[
"Number"]);
-
-
for (
int i =
0; i < jd[
"Member"].Count; i++)
-
{
-
Debug.Log(
"姓名:" + jd[
"Member"][i][
"Name"] +
",年龄:" + jd[
"Member"][i][
"Age"] +
",学号:" + jd[
"Member"][i][
"Id"]);
-
}
-
sr.Close();
-
}
-
}
队伍名:Dreamer
队伍人数:3
姓名:Tom,年龄:20,学号:20111234
姓名:Jack,年龄:22,学号:20112312