詳解C#對XML、JSON等格式的解析
一、C#對XML格式數(shù)據(jù)的解析
1、用XMLDocument來解析
XmlDocument xmlDocument = new XmlDocument(); xmlDocumentLoad("testxml"); //創(chuàng)建新節(jié)點(diǎn) XmlElement nn = xmlDocumentCreateElement("image"); nnSetAttribute("imageUrl", "jpg"); XmlNode node = xmlDocumentSelectSingleNode("content/section/page/gall/folder");//定位到folder節(jié)點(diǎn) nodeAppendChild(nn);//附加新節(jié)點(diǎn) //保存 xmlDocumentSave("testxml");
2、用Linq to XML來解析
可以通過遍歷,來獲得你想要的節(jié)點(diǎn)的內(nèi)容或?qū)傩?br />
XElement root = XElementLoad("testxml"); foreach (XAttribute att in rootAttributes()) { rootAdd(new XElement(attName, (string)att)); } ConsoleWriteLine(root);
3、附一個(gè)詳細(xì)點(diǎn)的例子
比如要解析如下的xml文件,將其轉(zhuǎn)化為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>
在控制臺應(yīng)用程序中輸入如下代碼即可。
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格式數(shù)據(jù)的解析
引用NewtonsoftJsondll文件,來解析。
比如:有個(gè)要解析的JSON字符串
[{"TaskRoleSpaces":"","TaskRoles":"","ProxyUserID":"5d9ad5dc1c5e494db1d1b4d8d79b60a7","UserID":"5d9ad5dc1c5e494db1d1b4d8d79b60a7","UserName":"姓名","UserSystemName":"2234","OperationName":"送合同負(fù)責(zé)人","OperationValue":"同意","OperationValueText":"","SignDate":"2013-06-19 10:31:26","Comment":"同意","FormDataHashCode":"","SignatureDivID":""},{"TaskRoleSpaces":"","TaskRoles":"","ProxyUserID":"2c96c3943826ea93013826eafe6d0089","UserID":"2c96c3943826ea93013826eafe6d0089","UserName":"姓名2","UserSystemName":"1234","OperationName":"送合同負(fù)責(zé)人","OperationValue":"同意","OperationValueText":"","SignDate":"2013-06-20 09:37:11","Comment":"同意","FormDataHashCode":"","SignatureDivID":""}]
首先定義個(gè)實(shí)體類:
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函數(shù)內(nèi)部輸入如下代碼:
string json = @"[{'TaskRoleSpaces':'','TaskRoles':'','ProxyUserID':'5d9ad5dc1c5e494db1d1b4d8d79b60a7','UserID':'5d9ad5dc1c5e494db1d1b4d8d79b60a7','UserName':'姓名','UserSystemName':'2234','OperationName':'送合同負(fù)責(zé)人','OperationValue':'同意','OperationValueText':'','SignDate':'2013-06-19 10:31:26','Comment':'同意','FormDataHashCode':'','SignatureDivID':''},{'TaskRoleSpaces':'','TaskRoles':'','ProxyUserID':'2c96c3943826ea93013826eafe6d0089','UserID':'2c96c3943826ea93013826eafe6d0089','UserName':'姓名2','UserSystemName':'1234','OperationName':'送合同負(fù)責(zé)人','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); }
這樣就可以正常輸出內(nèi)容了。
我想肯定有人會問,如果有多層關(guān)系的json字符串該如何處理呢?沒關(guān)系,一樣的處理。
比如如何解析這個(gè)json字符串:[{'phantom':true,'id':'20130717001','data':{'MID':1019,'Name':'aaccccc','Des':'cc','Disable':'啟用','Remark':'cccc'}}] ?
首先還是定義實(shí)體類:
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); }
按照我們的預(yù)期,應(yīng)該能夠得到1019的結(jié)果。
截圖為證:
再附一個(gè)JSON解析的例子,來自于兔子家族—二哥在本篇博客下的回復(fù)。
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}]}}
定義數(shù)據(jù)結(jié)構(gòu):
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函數(shù):
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}}}
在控制臺應(yīng)用程序下的完整代碼:
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這里怎么處理,其實(shí)很簡單就是一個(gè)數(shù)組而已。
完整代碼如下:
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; } } }
除了上述返回類的實(shí)體對象做法之外,JSONNET還提供了JObject類,可以取自己指定節(jié)點(diǎn)的內(nèi)容。
比如:
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; } } }
直接運(yùn)行,返回結(jié)果如下:
如果輸出內(nèi)容修改為:
ConsoleWriteLine(jo["data"]);
繼續(xù)取bin節(jié)點(diǎn)。
ConsoleWriteLine(jo["data"]["bin"]);
最后我們?nèi)∑渲衝ame對應(yīng)的value。
ConsoleWriteLine(jo["data"]["bin"]["name"]);
一步一步的獲取了JSON字符串對應(yīng)的Value。
——————————————————————————————————————————————————
群里有人提出一個(gè)問題,比如我要生成如下的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": [ ] } ] } ] } ] }
通過觀察我們會發(fā)現(xiàn),其實(shí)規(guī)律比較好找,就是包含id、value、child這樣的屬性,child又包含id、value、child這樣的屬性,可以無限循環(huán)下去,是個(gè)典型的樹形結(jié)構(gòu)。
完整的代碼如下:
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; } } }
我們驗(yàn)證一下生成的結(jié)果:
JObject jo = (JObject)JsonConvertDeserializeObject(json); ConsoleWriteLine(jo);
再來一個(gè)復(fù)雜點(diǎn)的JSON結(jié)構(gòu):
[ { "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; } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C#對多個(gè)集合和數(shù)組的操作方法(合并,去重,判斷)
欄 目:C#教程
下一篇:c# 兩個(gè)數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實(shí)現(xiàn)
本文標(biāo)題:詳解C#對XML、JSON等格式的解析
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6102.html
您可能感興趣的文章
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動對資源的釋放
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#中Socket通信用法實(shí)例詳解
- 01-10C#實(shí)現(xiàn)獲取不同對象中名稱相同屬性的方法
- 01-10C#裝箱和拆箱原理詳解
- 01-10C#編程自學(xué)之類和對象
- 01-10C#類的多態(tài)性詳解
- 01-10C#創(chuàng)建不規(guī)則窗體的4種方式詳解
- 01-10C#中深度復(fù)制和淺度復(fù)制詳解
- 01-10C#編程和Visual Studio使用技巧(上)


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery