XML与JSON在开发中非常重要, 其实核心就是处理字符串。一个是XML的字符串一个是JSON的字符串,尤其是在处理网络请求的时候,肯定是要用的。另外现在JSON非常的流行,我写了一个简单的例子融合了XML与JSON的合成与解析,希望大家喜欢!
首先注意头文件,LitJson是处理JSON的第三方库,最后我会给出下载地址。
1
2
3
4
5
6
7
|
using
UnityEngine;
using
System.Collections;
using
System.Collections.Generic;
using
System.Xml;
using
System.IO;
using
System.Text;
using
LitJson;
|
1、生成XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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!"
);
}
}
|
运行结果
1
2
3
4
5
6
7
|
<transforms>
<rotation id=
"0"
name=
"momo"
>
<x>0</x>
<y>1</y>
<z id=
"1"
>2</z>
</rotation>
</transforms>
|
2.更新XML文件
以其中某个节点名称做条件,当查询到时更新该节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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!"
);
}
}
|
运行结果
1
2
3
4
5
6
7
|
<transforms>
<rotation id=
"1000"
name=
"momo"
>
<x>0</x>
<y>1</y>
<z id=
"1"
>update00000</z>
</rotation>
</transforms>
|
3.添加XML
重复的地方我就不解释拉。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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!"
);
}
}
|
运行结果
1
2
3
4
5
6
7
8
9
10
11
12
|
<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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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!"
);
}
}
|
运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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字符串显示字典键值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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字符串,先合成 然后在输出。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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祝大家学习愉快,哈哈哈。