本文转载自雨松大大
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祝大家学习愉快,哈哈哈。