好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详解C#对XML、JSON等格式的解析

一、c#对xml格式数据的解析

1、用xmldocument来解析

?

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来解析

可以通过遍历,来获得你想要的节点的内容或属性

?

xelement root = xelementload( "testxml" );

foreach (xattribute att in rootattributes())

{

   rootadd( new xelement(attname, ( string )att));

}

consolewriteline(root);

3、附一个详细点的例子

比如要解析如下的xml文件,将其转化为ilist对象。

?

<? 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 >

在控制台应用程序中输入如下代码即可。

?

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字符串

?

[{ "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" : "" }]

首先定义个实体类:

?

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函数内部输入如下代码:

?

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'}}]  ?

首先还是定义实体类:

?

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方法里面,键入:

?

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}]}}

定义数据结构:

?

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函数:

?

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:

?

{\"success\": true ,\"data\":{\"name\":\"张三\",\"moulds\":{\"stockimport\": true ,\"stockexport\": true ,\"justifylocation\": true ,\"justifybin\": false ,\"binrelease\": false }}}

在控制台应用程序下的完整代码:

?

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:

?

{

   "success" : true ,

   "data" : {

     "id" : 100001,

     "bin" : "jit-3js-2k" ,

     "targetbin" : "jit-3js-3k" ,

     "batchs" : [

       "b20140101" ,

       "b20140102"

     ]

   }

}

他的问题主要是不知道batchs这里怎么处理,其实很简单就是一个数组而已。

完整代码如下:

?

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类,可以取自己指定节点的内容。

比如:

?

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 ; }

   }

}

直接运行,返回结果如下:

如果输出内容修改为:

?

consolewriteline(jo[ "data" ]);

继续取bin节点。

?

consolewriteline(jo[ "data" ][ "bin" ]);

最后我们取其中name对应的value。

?

consolewriteline(jo[ "data" ][ "bin" ][ "name" ]);

一步一步的获取了json字符串对应的value。

——————————————————————————————————————————————————

群里有人提出一个问题,比如我要生成如下的json字符串,该如何处理呢?

?

{

   "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这样的属性,可以无限循环下去,是个典型的树形结构。

完整的代码如下:

?

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 ; }

   }

}

我们验证一下生成的结果:

?

jobject jo = (jobject)jsonconvertdeserializeobject(json);

consolewriteline(jo);

再来一个复杂点的json结构:

?

[

   {

     "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"

       }

     ]

   }

]

?

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

dy("nrwz");

查看更多关于详解C#对XML、JSON等格式的解析的详细内容...

  阅读:47次