XML与JSON在开发中非常重要, 其实核心就是处理字符串。一个是XML的字符串一个是JSON的字符串,尤其是在处理网络请求的时候,肯定是要用的。另外现在JSON非常的流行,我写了一个简单的例子融合了XML与JSON的合成与解析,希望大家喜欢!
首先注意头文件,LitJson是处理JSON的第三方库,最后我会给出下载地址。
1 |
using UnityEngine; |
2 |
using System.Collections; |
3 |
using System.Collections.Generic; |
4 |
using System.Xml; |
5 |
using System.IO; |
6 |
using System.Text; |
7 |
using LitJson; |
1、生成XML
01 |
public void createXml() |
02 |
{ |
03 |
//xml保存的路径,这里放在Assets路径 注意路径。 |
04 |
string filepath = Application.dataPath + @"/my.xml" ; |
05 |
//继续判断当前路径下是否有该文件 |
06 |
if (!File.Exists (filepath)) |
07 |
{ |
08 |
//创建XML文档实例 |
09 |
XmlDocument xmlDoc = new XmlDocument(); |
10 |
//创建root节点,也就是最上一层节点 |
11 |
XmlElement root = xmlDoc.CreateElement( "transforms" ); |
12 |
//继续创建下一层节点 |
13 |
XmlElement elmNew = xmlDoc.CreateElement( "rotation" ); |
14 |
//设置节点的两个属性 ID 和 NAME |
15 |
elmNew.SetAttribute( "id" , "0" ); |
16 |
elmNew.SetAttribute( "name" , "momo" ); |
17 |
//继续创建下一层节点 |
18 |
XmlElement rotation_X = xmlDoc.CreateElement( "x" ); |
19 |
//设置节点中的数值 |
20 |
rotation_X.InnerText = "0" ; |
21 |
XmlElement rotation_Y = xmlDoc.CreateElement( "y" ); |
22 |
rotation_Y.InnerText = "1" ; |
23 |
XmlElement rotation_Z = xmlDoc.CreateElement( "z" ); |
24 |
rotation_Z.InnerText = "2" ; |
25 |
//这里在添加一个节点属性,用来区分。。 |
26 |
rotation_Z.SetAttribute( "id" , "1" ); |
27 |
28 |
//把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序 |
29 |
elmNew.AppendChild(rotation_X); |
30 |
elmNew.AppendChild(rotation_Y); |
31 |
elmNew.AppendChild(rotation_Z); |
32 |
root.AppendChild(elmNew); |
33 |
xmlDoc.AppendChild(root); |
34 |
//把XML文件保存至本地 |
35 |
xmlDoc.Save(filepath); |
36 |
Debug.Log( "createXml OK!" ); |
37 |
} |
38 |
} |
运行结果
1 |
<transforms> |
2 |
<rotation id= "0" name= "momo" > |
3 |
<x>0</x> |
4 |
<y>1</y> |
5 |
<z id= "1" >2</z> |
6 |
</rotation> |
7 |
</transforms> |
2.更新XML文件
以其中某个节点名称做条件,当查询到时更新该节点
01 |
public void UpdateXml() |
02 |
{ |
03 |
string filepath = Application.dataPath + @"/my.xml" ; |
04 |
if (File.Exists (filepath)) |
05 |
{ |
06 |
XmlDocument xmlDoc = new XmlDocument(); |
07 |
//根据路径将XML读取出来 |
08 |
xmlDoc.Load(filepath); |
09 |
//得到transforms下的所有子节点 |
10 |
XmlNodeList nodeList=xmlDoc.SelectSingleNode( "transforms" ).ChildNodes; |
11 |
//遍历所有子节点 |
12 |
foreach (XmlElement xe in nodeList) |
13 |
{ |
14 |
//拿到节点中属性ID =0的节点 |
15 |
if (xe.GetAttribute( "id" )== "0" ) |
16 |
{ |
17 |
//更新节点属性 |
18 |
xe.SetAttribute( "id" , "1000" ); |
19 |
//继续遍历 |
20 |
foreach (XmlElement x1 in xe.ChildNodes) |
21 |
{ |
22 |
if (x1.Name== "z" ) |
23 |
{ |
24 |
//这里是修改节点名称对应的数值,而上面的拿到节点连带的属性。。。 |
25 |
x1.InnerText= "update00000" ; |
26 |
} |
27 |
28 |
} |
29 |
break ; |
30 |
} |
31 |
} |
32 |
xmlDoc.Save(filepath); |
33 |
Debug.Log( "UpdateXml OK!" ); |
34 |
} |
35 |
36 |
} |
运行结果
1 |
<transforms> |
2 |
<rotation id= "1000" name= "momo" > |
3 |
<x>0</x> |
4 |
<y>1</y> |
5 |
<z id= "1" >update00000</z> |
6 |
</rotation> |
7 |
</transforms> |
3.添加XML
重复的地方我就不解释拉。
01 |
public void AddXml() |
02 |
{ |
03 |
string filepath = Application.dataPath + @"/my.xml" ; |
04 |
if (File.Exists (filepath)) |
05 |
{ |
06 |
XmlDocument xmlDoc = new XmlDocument(); |
07 |
xmlDoc.Load(filepath); |
08 |
XmlNode root = xmlDoc.SelectSingleNode( "transforms" ); |
09 |
XmlElement elmNew = xmlDoc.CreateElement( "rotation" ); |
10 |
elmNew.SetAttribute( "id" , "1" ); |
11 |
elmNew.SetAttribute( "name" , "yusong" ); |
12 |
13 |
XmlElement rotation_X = xmlDoc.CreateElement( "x" ); |
14 |
rotation_X.InnerText = "0" ; |
15 |
rotation_X.SetAttribute( "id" , "1" ); |
16 |
XmlElement rotation_Y = xmlDoc.CreateElement( "y" ); |
17 |
rotation_Y.InnerText = "1" ; |
18 |
XmlElement rotation_Z = xmlDoc.CreateElement( "z" ); |
19 |
rotation_Z.InnerText = "2" ; |
20 |
21 |
elmNew.AppendChild(rotation_X); |
22 |
elmNew.AppendChild(rotation_Y); |
23 |
elmNew.AppendChild(rotation_Z); |
24 |
root.AppendChild(elmNew); |
25 |
xmlDoc.AppendChild(root); |
26 |
xmlDoc.Save(filepath); |
27 |
Debug.Log( "AddXml OK!" ); |
28 |
} |
29 |
} |
运行结果
01 |
<transforms> |
02 |
<rotation id= "1000" name= "momo" > |
03 |
<x>0</x> |
04 |
<y>1</y> |
05 |
<z id= "1" >update00000</z> |
06 |
</rotation> |
07 |
<rotation id= "1" name= "yusong" > |
08 |
<x id= "1" >0</x> |
09 |
<y>1</y> |
10 |
<z>2</z> |
11 |
</rotation> |
12 |
</transforms> |
4.删除XML
01 |
public void deleteXml() |
02 |
{ |
03 |
string filepath = Application.dataPath + @"/my.xml" ; |
04 |
if (File.Exists (filepath)) |
05 |
{ |
06 |
XmlDocument xmlDoc = new XmlDocument(); |
07 |
xmlDoc.Load(filepath); |
08 |
XmlNodeList nodeList=xmlDoc.SelectSingleNode( "transforms" ).ChildNodes; |
09 |
foreach (XmlElement xe in nodeList) |
10 |
{ |
11 |
if (xe.GetAttribute( "id" )== "1" ) |
12 |
{ |
13 |
xe.RemoveAttribute( "id" ); |
14 |
} |
15 |
16 |
foreach (XmlElement x1 in xe.ChildNodes) |
17 |
{ |
18 |
if (x1.Name == "z" ) |
19 |
{ |
20 |
x1.RemoveAll(); |
21 |
22 |
} |
23 |
} |
24 |
} |
25 |
xmlDoc.Save(filepath); |
26 |
Debug.Log( "deleteXml OK!" ); |
27 |
} |
28 |
29 |
} |
运行结果
01 |
<transforms> |
02 |
<rotation id= "1000" name= "momo" > |
03 |
<x>0</x> |
04 |
<y>1</y> |
05 |
<z> |
06 |
</z> |
07 |
</rotation> |
08 |
<rotation name= "yusong" > |
09 |
<x id= "1" >0</x> |
10 |
<y>1</y> |
11 |
<z> |
12 |
</z> |
13 |
</rotation> |
14 |
</transforms> |
4.解析与输出上面的XML
01 |
public void showXml() |
02 |
{ |
03 |
string filepath = Application.dataPath + @"/my.xml" ; |
04 |
if (File.Exists (filepath)) |
05 |
{ |
06 |
XmlDocument xmlDoc = new XmlDocument(); |
07 |
xmlDoc.Load(filepath); |
08 |
XmlNodeList nodeList=xmlDoc.SelectSingleNode( "transforms" ).ChildNodes; |
09 |
//遍历每一个节点,拿节点的属性以及节点的内容 |
10 |
foreach (XmlElement xe in nodeList) |
11 |
{ |
12 |
Debug.Log( "Attribute :" + xe.GetAttribute( "name" )); |
13 |
Debug.Log( "NAME :" + xe.Name); |
14 |
foreach (XmlElement x1 in xe.ChildNodes) |
15 |
{ |
16 |
if (x1.Name == "y" ) |
17 |
{ |
18 |
Debug.Log( "VALUE :" + x1.InnerText); |
19 |
20 |
} |
21 |
} |
22 |
} |
23 |
Debug.Log( "all = " + xmlDoc.OuterXml); |
24 |
25 |
} |
26 |
} |
运行结果(点击图片最大化)
接着是处理JSON
5.解析JSON字符串显示字典键值
01 |
public void ResolveJson() |
02 |
{ |
03 |
//定义的JSON字符串,注意JSON的格式 |
04 |
string str = @" |
05 |
{ |
06 |
""Name"" : ""yusong"", |
07 |
""Age"" : 26, |
08 |
""Birthday"" : ""1986-11-21"", |
09 |
""Thumbnail"":[ |
10 |
{ |
11 |
""Url"": ""http://xuanyusong.com"", |
12 |
""Height"": 256, |
13 |
""Width"": ""200"" |
14 |
}, |
15 |
{ |
16 |
""Url"": ""http://baidu.com"", |
17 |
""Height"": 1024, |
18 |
""Width"": ""500"" |
19 |
} |
20 |
21 |
] |
22 |
}" ; |
23 |
//这里是解析,包括整形与字符串 |
24 |
JsonData jd = JsonMapper.ToObject(str); |
25 |
Debug.Log( "name = " + ( string )jd[ "Name" ]); |
26 |
Debug.Log( "Age = " + ( int )jd[ "Age" ]); |
27 |
Debug.Log( "Birthday = " + ( string )jd[ "Birthday" ]); |
28 |
JsonData jdItems = jd[ "Thumbnail" ]; |
29 |
30 |
for ( int i = 0; i < jdItems.Count; i++) |
31 |
{ |
32 |
Debug.Log( "URL = " + jdItems[i][ "Url" ]); |
33 |
Debug.Log( "Height = " + ( int )jdItems[i][ "Height" ]); |
34 |
Debug.Log( "Width = " + jdItems[i][ "Width" ]); |
35 |
} |
36 |
} |
运行结果
6.合成JSON字符串,先合成 然后在输出。
01 |
public void MergerJson() |
02 |
{ |
03 |
StringBuilder sb = new StringBuilder (); |
04 |
JsonWriter writer = new JsonWriter (sb); |
05 |
06 |
writer.WriteObjectStart (); |
07 |
08 |
writer.WritePropertyName ( "Name" ); |
09 |
writer.Write ( "yusong" ); |
10 |
11 |
writer.WritePropertyName ( "Age" ); |
12 |
writer.Write (26); |
13 |
14 |
writer.WritePropertyName ( "Girl" ); |
15 |
16 |
writer.WriteArrayStart (); |
17 |
18 |
writer.WriteObjectStart(); |
19 |
writer.WritePropertyName( "name" ); |
20 |
writer.Write( "ruoruo" ); |
21 |
writer.WritePropertyName( "age" ); |
22 |
writer.Write(24); |
23 |
writer.WriteObjectEnd (); |
24 |
25 |
writer.WriteObjectStart(); |
26 |
writer.WritePropertyName( "name" ); |
27 |
writer.Write( "momo" ); |
28 |
writer.WritePropertyName( "age" ); |
29 |
writer.Write(26); |
30 |
writer.WriteObjectEnd (); |
31 |
32 |
writer.WriteArrayEnd(); |
33 |
34 |
writer.WriteObjectEnd (); |
35 |
Debug.Log(sb.ToString ()); |
36 |
37 |
JsonData jd = JsonMapper.ToObject(sb.ToString ()); |
38 |
Debug.Log( "name = " + ( string )jd[ "Name" ]); |
39 |
Debug.Log( "Age = " + ( int )jd[ "Age" ]); |
40 |
JsonData jdItems = jd[ "Girl" ]; |
41 |
for ( int i = 0; i < jdItems.Count; i++) |
42 |
{ |
43 |
Debug.Log( "Girl name = " + jdItems[i][ "name" ]); |
44 |
Debug.Log( "Girl age = " + ( int )jdItems[i][ "age" ]); |
45 |
} |
46 |
} |
运行结果