一、c#对xml格式数据的解析
1、用xmldocument来解析
1
2
3
4
5
6
7
8
9
10
11
12
|
xmldocument xmldocument = new xmldocument(); xmldocumentload( "testxml" ); //创建新节点 xmlelement nn = xmldocumentcreateelement( "image" ); nnsetattribute( "imageurl" , "jpg" ); xmlnode node = xmldocumentselectsinglenode( "content/section/page/gall/folder" ); //定位到folder节点 nodeappendchild(nn); //附加新节点 //保存 xmldocumentsave( "testxml" ); |
2、用linq to xml来解析
可以通过遍历,来获得你想要的节点的内容或属性
1
2
3
4
5
6
|
xelement root = xelementload( "testxml" ); foreach (xattribute att in rootattributes()) { rootadd( new xelement(attname, ( string )att)); } consolewriteline(root); |
3、附一个详细点的例子
比如要解析如下的xml文件,将其转化为ilist对象。
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
|
<? xml version = "0" encoding = "utf-8" ?> < car > < carcost > < id >20130821133126</ id > < uptime >60</ uptime > < downtime >30</ downtime > < price >4</ price > </ carcost > < carcost > < id >20130821014316</ id > < uptime >120</ uptime > < downtime >60</ downtime > < price >3</ price > </ carcost > < carcost > < id >20130822043127</ id > < uptime >30</ uptime > < downtime >0</ downtime > < price >5</ price > </ carcost > < carcost > < id >20130822043341</ id > < uptime >120以上!</ uptime > < downtime >120</ downtime > < price >2</ price > </ carcost > </ car > |
在控制台应用程序中输入如下代码即可。
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
|
class program { static void main( string [] args) { ilist<carcost> resultlist = new list<carcost>(); xmldocument xmldocument = new xmldocument(); xmldocumentload( "testxml" ); xmlnodelist xmlnodelist = xmldocumentselectsinglenode( "car" )childnodes; foreach (xmlnode list in xmlnodelist) { carcost carcost = new carcost ( listselectsinglenode( "id" )innertext, listselectsinglenode( "uptime" )innertext, listselectsinglenode( "downtime" )innertext, floatparse(listselectsinglenode( "price" )innertext) ); resultlistadd(carcost); } ienumerator enumerator = resultlistgetenumerator(); while (enumeratormovenext()) { carcost carcost = enumeratorcurrent as carcost; consolewriteline(carcostid + " " + carcostuptime + " " + carcostdowntime + " " + carcostprice); } } } public class carcost { public carcost( string id, string uptime, string downtime, float price) { thisid = id; thisuptime = uptime; thisdowntime = downtime; thisprice = price; } public string id { get ; set ; } public string uptime { get ; set ; } public string downtime { get ; set ; } public float price { get ; set ; } } |
二、c#对json格式数据的解析
引用newtonsoftjsondll文件,来解析。
比如:有个要解析的json字符串
1
|
[{ "taskrolespaces" : "" , "taskroles" : "" , "proxyuserid" : "5d9ad5dc1c5e494db1d1b4d8d79b60a7" , "userid" : "5d9ad5dc1c5e494db1d1b4d8d79b60a7" , "username" : "姓名" , "usersystemname" : "2234" , "operationname" : "送合同负责人" , "operationvalue" : "同意" , "operationvaluetext" : "" , "signdate" : "2013-06-19 10:31:26" , "comment" : "同意" , "formdatahashcode" : "" , "signaturedivid" : "" },{ "taskrolespaces" : "" , "taskroles" : "" , "proxyuserid" : "2c96c3943826ea93013826eafe6d0089" , "userid" : "2c96c3943826ea93013826eafe6d0089" , "username" : "姓名2" , "usersystemname" : "1234" , "operationname" : "送合同负责人" , "operationvalue" : "同意" , "operationvaluetext" : "" , "signdate" : "2013-06-20 09:37:11" , "comment" : "同意" , "formdatahashcode" : "" , "signaturedivid" : "" }] |
首先定义个实体类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class jobinfo { public string taskrolespaces { get ; set ; } public string taskroles { get ; set ; } public string proxyuserid { get ; set ; } public string userid { get ; set ; } public string username { get ; set ; } public string usersystemname { get ; set ; } public string operationname { get ; set ; } public string operationvalue { get ; set ; } public string operationvaluetext { get ; set ; } public datetime signdate { get ; set ; } public string comment { get ; set ; } public string formdatahashcode { get ; set ; } public string signaturedivid { get ; set ; } } |
然后在控制台main函数内部输入如下代码:
1
2
3
4
5
6
7
8
9
|
string json = @"[{'taskrolespaces':'','taskroles':'','proxyuserid':'5d9ad5dc1c5e494db1d1b4d8d79b60a7','userid':'5d9ad5dc1c5e494db1d1b4d8d79b60a7','username':'姓名','usersystemname':'2234','operationname':'送合同负责人','operationvalue':'同意','operationvaluetext':'','signdate':'2013-06-19 10:31:26','comment':'同意','formdatahashcode':'','signaturedivid':''},{'taskrolespaces':'','taskroles':'','proxyuserid':'2c96c3943826ea93013826eafe6d0089','userid':'2c96c3943826ea93013826eafe6d0089','username':'姓名2','usersystemname':'1234','operationname':'送合同负责人','operationvalue':'同意','operationvaluetext':'','signdate':'2013-06-20 09:37:11','comment':'同意','formdatahashcode':'','signaturedivid':''}] " ; list<jobinfo> jobinfolist = jsonconvertdeserializeobject<list<jobinfo>>(json); foreach (jobinfo jobinfo in jobinfolist) { consolewriteline( "username:" + jobinfousername + "userid:" + jobinfouserid); } |
这样就可以正常输出内容了。
我想肯定有人会问,如果有多层关系的json字符串该如何处理呢?没关系,一样的处理。
比如如何解析这个json字符串:[{'phantom':true,'id':'20130717001','data':{'mid':1019,'name':'aaccccc','des':'cc','disable':'启用','remark':'cccc'}}] ?
首先还是定义实体类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class info { public string phantom { get ; set ; } public string id { get ; set ; } public data data { get ; set ; } } public class data { public int mid { get ; set ; } public string name { get ; set ; } public string des { get ; set ; } public string disable { get ; set ; } public string remark { get ; set ; } } |
然后在main方法里面,键入:
1
2
3
4
5
6
7
|
string json = @"[{'phantom':true,'id':'20130717001','data':{'mid':1019,'name':'aaccccc','des':'cc','disable':'启用','remark':'cccc'}}]" ; list<info> infolist = jsonconvertdeserializeobject<list<info>>(json); foreach (info info in infolist) { consolewriteline( "id:" + infodatamid); } |
按照我们的预期,应该能够得到1019的结果。
截图为证:
再附一个json解析的例子,来自于兔子家族—二哥在本篇博客下的回复。
json字符串1:{success:true,data:{id:100001,code:\"jtl-z38005\",name:\"奥迪三轮毂\",location:\"a-202\",qty:100,bins:[{code:\"jtl-z38001\",name:\"奥迪三轮毂\",location:\"a-001\",qty:100},{ code:\"jtl-z38002\",name:\"奥迪三轮毂\",location:\"a-002\",qty:100}]}}
定义数据结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class data { public boolean success { get ; set ; } public data1 data { get ; set ; } } public class data1 { public int32 id { get ; set ; } public string code { get ; set ; } public string name { get ; set ; } public string location { get ; set ; } public int32 qty { get ; set ; } public list<data2> bins { get ; set ; } } public class data2 { public string code { get ; set ; } public string name { get ; set ; } public string location { get ; set ; } public int32 qty { get ; set ; } } |
main函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class program { static void main( string [] args) { string json = "{success:true,data:{id:100001,code:\"jtl-z38005\",name:\"奥迪三轮毂\",location:\"a-202\",qty:100,bins:[{code:\"jtl-z38001\",name:\"奥迪三轮毂\",location:\"a-001\",qty:100},{ code:\"jtl-z38002\",name:\"奥迪三轮毂\",location:\"a-002\",qty:100}]}}" ; data data = jsonconvertdeserializeobject<data>(json); foreach (var item in datadatabins) { //输出:jtl-z38001、jtl-z38002,其它类似 consolewriteline(itemcode); } } } |
json字符串2:
1
|
{\"success\": true ,\"data\":{\"name\":\"张三\",\"moulds\":{\"stockimport\": true ,\"stockexport\": true ,\"justifylocation\": true ,\"justifybin\": false ,\"binrelease\": false }}} |
在控制台应用程序下的完整代码:
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
|
namespace consoleapplication1 { class program { static void main( string [] args) { string json = "{\"success\":true,\"data\":{\"name\":\"张三\",\"moulds\":{\"stockimport\":true,\"stockexport\":true,\"justifylocation\":true,\"justifybin\":false,\"binrelease\":false}}}" ; data data = jsonconvertdeserializeobject<data>(json); consolewriteline(datadatamouldsbinrelease); //输出false } } public class data { public boolean success { get ; set ; } public data1 data { get ; set ; } } public class data1 { public string name { get ; set ; } public data2 moulds { get ; set ; } } public class data2 { public boolean stockimport { get ; set ; } public boolean stockexport { get ; set ; } public boolean justifylocation { get ; set ; } public boolean justifybin { get ; set ; } public boolean binrelease { get ; set ; } } } |
json字符串3:
1
2
3
4
5
6
7
8
9
10
11
12
|
{ "success" : true , "data" : { "id" : 100001, "bin" : "jit-3js-2k" , "targetbin" : "jit-3js-3k" , "batchs" : [ "b20140101" , "b20140102" ] } } |
他的问题主要是不知道batchs这里怎么处理,其实很简单就是一个数组而已。
完整代码如下:
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
|
namespace consoleapplication1 { class program { static void main( string [] args) { string json = "{\"success\": true,\"data\": {\"id\": 100001,\"bin\": \"jit-3js-2k\",\"targetbin\": \"jit-3js-3k\",\"batchs\": [\"b20140101\",\"b20140102\"]}}" ; data data = jsonconvertdeserializeobject<data>(json); foreach (var item in datadatabatchs) { consolewriteline(item); //输出:b20140101、b20140102 } } } public class data { public boolean success { get ; set ; } public data1 data { get ; set ; } } public class data1 { public int32 id { get ; set ; } public string bin { get ; set ; } public string targetbin { get ; set ; } public string [] batchs { get ; set ; } } } |
除了上述返回类的实体对象做法之外,jsonnet还提供了jobject类,可以取自己指定节点的内容。
比如:
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
|
namespace consoleapplication1 { class program { static void main( string [] args) { string j = "{success:true,data:{ bin:{code:\"jtl-z38001\",name:\"奥迪三轮毂\",location:\"a-001\",qty:100}}}" ; jobject jo = (jobject)jsonconvertdeserializeobject(j); consolewriteline(jo); } } public class data { public boolean success { get ; set ; } public data1 data { get ; set ; } } public class data1 { public data2 bin { get ; set ; } } public class data2 { public string code { get ; set ; } public string name { get ; set ; } public string location { get ; set ; } public int32 qty { get ; set ; } } } |
直接运行,返回结果如下:
如果输出内容修改为:
1
|
consolewriteline(jo[ "data" ]); |
继续取bin节点。
1
|
consolewriteline(jo[ "data" ][ "bin" ]); |
最后我们取其中name对应的value。
1
|
consolewriteline(jo[ "data" ][ "bin" ][ "name" ]); |
一步一步的获取了json字符串对应的value。
——————————————————————————————————————————————————
群里有人提出一个问题,比如我要生成如下的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
|
{ "id" : 1, "value" : "cate" , "child" : [ { "id" : 1, "value" : "cate" , "child" : [ ] }, { "id" : 1, "value" : "cate" , "child" : [ { "id" : 2, "value" : "cate2" , "child" : [ { "id" : 3, "value" : "cate3" , "child" : [ ] } ] } ] } ] } |
通过观察我们会发现,其实规律比较好找,就是包含id、value、child这样的属性,child又包含id、value、child这样的属性,可以无限循环下去,是个典型的树形结构。
完整的代码如下:
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
47
|
namespace consoleapplication1 { class program { static void main( string [] args) { data data = new data(); dataid = 1; datavalue = "cate" ; datachild = new list<data>() { new data(){ id=1,value= "cate" ,child= new list<data>(){}} , new data(){ id=1,value= "cate" ,child= new list<data>() { new data() { id=2, value= "cate2" , child = new list<data>() { new data() { id = 3, value = "cate3" , child = new list<data>(){}, } }, } }} , }; //序列化为json字符串 string json = jsonconvertserializeobject(data); consolewriteline(json); //反序列化为对象 data jsondata = jsonconvertdeserializeobject<data>(json); } } public class data { public int id { get ; set ; } public string value { get ; set ; } public list<data> child { get ; set ; } } } |
我们验证一下生成的结果:
1
2
|
jobject jo = (jobject)jsonconvertdeserializeobject(json); consolewriteline(jo); |
再来一个复杂点的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
|
[ { "downlist" : [], "line" : { "id" : -1, "name" : "admin" , "iccard" : "1" }, "uplist" : [ { "endtime" : "18:10" , "starttime" : "06:40" , "sid" : 385, "stype" : "38" }, { "endtime" : "18:10" , "starttime" : "06:40" , "sid" : 1036, "stype" : "38" } ] }, { "downlist" : [], "line" : { "id" : -1, "name" : "admin" , "iccard" : "1" }, "uplist" : [ { "endtime" : "18:10" , "starttime" : "06:40" , "sid" : 385, "stype" : "38" }, { "endtime" : "18:10" , "starttime" : "06:40" , "sid" : 1036, "stype" : "38" } ] } ] |
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
47
48
49
50
51
52
53
54
55
56
57
|
namespace consoleapplication1 { class program { static void main( string [] args) { string jsonstring = "[{\"downlist\": [],\"line\": {\"id\": -1,\"name\": \"admin\",\"iccard\": \"1\"},\"uplist\": [{\"endtime\": \"18:10\",\"starttime\": \"06:40\",\"sid\": 385,\"stype\": \"38\"},{\"endtime\": \"18:10\",\"starttime\": \"06:40\",\"sid\": 1036,\"stype\": \"38\"}]},{\"downlist\": [],\"line\": {\"id\": -1,\"name\": \"admin\",\"iccard\": \"1\"},\"uplist\": [{\"endtime\": \"18:10\",\"starttime\": \"06:40\",\"sid\": 385,\"stype\": \"38\"},{\"endtime\": \"18:10\",\"starttime\": \"06:40\",\"sid\": 1036,\"stype\": \"38\"}]}]" ; data[] datas = jsonconvertdeserializeobject<data[]>(jsonstring); foreach (data data in datas) { downlist[] downlist = datadownlist; line line = dataline; uplist[] uplists = datauplist; //输出 consolewriteline(stringjoin( "," , lineid, linename, lineiccard)); foreach (uplist uplist in uplists) { consolewriteline(stringjoin( "," , uplistendtime, upliststarttime, uplistsid, upliststype)); } consolewriteline( "-----------------------------------------------" ); } } } public class data { public downlist[] downlist { get ; set ; } public line line { get ; set ; } public uplist[] uplist { get ; set ; } } public class downlist { } public class line { public int id { get ; set ; } public string name { get ; set ; } public string iccard { get ; set ; } } public class uplist { public string endtime { get ; set ; } public string starttime { get ; set ; } public int sid { get ; set ; } public string stype { get ; set ; } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/chinacsharper/article/details/9246627