




已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
對(duì)象和XML文件的轉(zhuǎn)換很多時(shí)候,我們開(kāi)發(fā)程序都需要使用到對(duì)象的XML序列化和反序列化,對(duì)象的XML序列化和反序列化,既可以使用XML對(duì)象(XmlDocument )進(jìn)行操作,也可以使用XmlSerializer進(jìn)行操作,兩個(gè)各有優(yōu)點(diǎn),就操作性而已,我傾向于使用后者來(lái)操作XML。本文介紹三種方式操作XML,普通的XDocument的API操作,方便的XmlSerializer對(duì)象序列化及反序列化操作,加密XML對(duì)象序列化操作。1、普通的XML對(duì)象操作,利用XML對(duì)象(XmlDocument )。一個(gè)典型的利用XmlDocument對(duì)象操作XML的例子代碼如下。1 public static void RunSnippet() 2 3 XmlDocument xmldoc = new XmlDocument ( ) ; 4 /加入XML的聲明段落 5 XmlNode xmlnode = xmldoc.CreateNode ( XmlNodeType.XmlDeclaration , , ) ; 6 xmldoc.AppendChild (xmlnode ) ; 7 /加入一個(gè)根元素 8 XmlElement xmlelem = xmldoc.CreateElement ( , ROOT , ) ; 9 XmlText xmltext = xmldoc.CreateTextNode ( Root Text ) ; 10 xmlelem.AppendChild ( xmltext ) ; 11 xmldoc.AppendChild ( xmlelem ) ; 12 /加入另外一個(gè)元素 13 XmlElement xmlelem2 = xmldoc.CreateElement (SampleElement ) ; 14 xmlelem2 = xmldoc.CreateElement ( , SampleElement , ) ; 15 xmltext = xmldoc.CreateTextNode ( The text of the sample element ) ; 16 xmlelem2.AppendChild ( xmltext ) ; 17 xmldoc.ChildNodes.Item(1).AppendChild ( xmlelem2 ) ; 18 /保存創(chuàng)建好的XML文檔 19 try 20 21 xmldoc.Save ( c:data.xml ) ; 22 23 catch ( Exception e ) 24 25 /顯示錯(cuò)誤信息 26 Console.WriteLine ( e.Message ) ; 27 28 Console.ReadLine ( ) ; 29 得到的輸出結(jié)果如下所示。30 31 Root Text 32 The text of the sample element 33 2、使用XmlSerializer進(jìn)行XML操作先提供兩個(gè)對(duì)象的序列化和反序列化的封裝函數(shù),如下所示。1 / 2 / 對(duì)象序列化XML到文件中 3 / 4 / 文件路徑 5 / 對(duì)象 6 / 對(duì)象類型 7 private bool XmlSerialize(string path, object obj, Type type) 8 9 XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 10 ns.Add(, ); 11 12 try 13 14 /如果文件目錄不存在,那么創(chuàng)建目錄 15 if (!File.Exists(path) 16 17 FileInfo fi = new FileInfo(path); 18 if (!fi.Directory.Exists) 19 20 Directory.CreateDirectory(fi.Directory.FullName); 21 22 23 24 using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None) 25 26 XmlSerializer format = new XmlSerializer(type); 27 28 format.Serialize(stream, obj, ns); 29 stream.Close(); 30 31 32 return true; 33 34 catch (Exception ex) 35 36 Console.WriteLine(ex.Message); 37 return false; 38 39 40 41 / 42 / XML反序列化 43 / 44 / 文件路徑 45 / 對(duì)象類型 46 / 47 private object XmlDeserialize(string path, Type type) 48 49 try 50 51 using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read) 52 53 XmlSerializer formatter = new XmlSerializer(type); 54 stream.Seek(0, SeekOrigin.Begin); 55 object obj = formatter.Deserialize(stream); 56 stream.Close(); 57 return obj; 58 59 60 catch 61 62 return null; 63 64 注意其中代碼 65 XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 66 ns.Add(, ); 是把默認(rèn)的xmlns命名空間多余的內(nèi)容去掉,這樣得到比較干凈的XML。在使用的時(shí)候,我們需要定義好對(duì)象的實(shí)體,這樣才能給予對(duì)象進(jìn)行操作,定義的實(shí)體類如下所示。67 Serializable 68 public class UserInfo 69 70 public string ID get; set; 71 public string UserNo get; set; 72 public string UserName get; set; 73 public string Sex get; set; 74 public string Birthday get; set; 75 76 77 Serializable 78 public class DataOfUser 79 80 XmlElement(ElementName = m_User) 81 public List list = new List(); 82 調(diào)用序列化函數(shù)的代碼例子如下所示83 private void btnUserNormal_Click(object sender, EventArgs e) 84 85 DataOfUser obj = new DataOfUser(); 86 UserInfo user = new UserInfo(); 87 user.ID=Guid.NewGuid().ToString(); 88 user.Sex = 男; 89 user.UserName = 張三; 90 user.UserNo = 20010001; 91 user.Birthday = 1999-1-1; 92 obj.list.Add(user); 93 94 user = new UserInfo(); 95 user.ID = Guid.NewGuid().ToString(); 96 user.Sex = 女; 97 user.UserName = 李氏; 98 user.UserNo = 20020001; 99 user.Birthday = 1998-1-1; 100 obj.list.Add(user); 101 102 try 103 104 XmlSerialize(C:User.xml, obj, obj.GetType(); 105 MessageUtil.ShowTips(Ok); 106 107 catch (Exception ex) 108 109 MessageUtil.ShowError(ex.Message); 110 111 這樣得到的XML內(nèi)容如下所示。112 113 114 115 f8a8b323-5c56-4c21-9ddf-1cd30f78dfca 116 20010001 117 張三 118 男 119 1999-1-1 120 121 122 bbb36378-ec27-4e20-ad4b-2d2dc7e142e4 123 20020001 124 李氏 125 女 126 1998-1-1 127 128 反序列化的操作也比較簡(jiǎn)單,不再贅述。3)把對(duì)象實(shí)例化到XML中并進(jìn)行加密處理首先我們定義兩個(gè)序列化加密、解碼并反序列化的函數(shù)如下所示。1 / 2 / XML序列化并加密 3 / 4 / 文件路徑 5 / 對(duì)象 6 / 對(duì)象類型 7 / 8 private bool XmlSerializeEncrypt(string path, object obj, Type type) 9 10 XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 11 ns.Add(, ); 12 13 try 14 15 if (!File.Exists(path) 16 17 FileInfo fi = new FileInfo(path); 18 if (!fi.Directory.Exists) 19 20 Directory.CreateDirectory(fi.Directory.FullName); 21 22 23 24 using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None) 25 26 string content = ; 27 using(MemoryStream ms = new MemoryStream() 28 29 XmlSerializer format = new XmlSerializer(type); 30 format.Serialize(ms, obj, ns); 31 ms.Seek(0, 0); 32 content = Encoding.UTF8.GetString(ms.ToArray(); 33 34 35 string encrypt = EncodeHelper.EncryptString(content); 36 byte bytes = Encoding.UTF8.GetBytes(encrypt); 37 stream.Write(bytes, 0, bytes.Length); 38 stream.Close(); 39 40 41 42 return true; 43 44 catch (Exception ex) 45 46 Console.WriteLine(ex.Message); 47 return false; 48 49 50 51 / 52 / 解密并進(jìn)行XML反序列化 53 / 54 / 文件路徑 55 / 對(duì)象類型 56 / 57 private object XmlDeserializeDecrypt(string path, Type type) 58 59 try 60 61 string encrypt = File.ReadAllText(path, Encoding.UTF8); 62 string content = EncodeHelper.DecryptString(encrypt, true); 63 byte bytes = Encoding.UTF8.GetBytes(content); 64 using (MemoryStream stream = new MemoryStream(bytes) 65 66 XmlSerializer formatter = new XmlSerializer(type); 67 68 stream.Seek(0, SeekOrigin.Begin); 69 object obj = formatter.Deserialize(stream); 70 stream.Close(); 71 return obj; 72 73 74 catch(Exception ex) 75 76 Console.WriteLine(ex.Message); 77 return null; 78 79 這樣函數(shù)定義好后,調(diào)用和前面沒(méi)有加密的差不多,如下所示。80 private void btnUserEncrypt_Click(object sender, EventArgs e) 81 82 DataOfUser obj = new DataOfUser(); 83 UserInfo user = new UserInfo(); 84 user.ID = Guid.NewGuid().ToString(); 85 user.Sex = 男; 86 user.UserName = 張三; 87 user.UserNo = 20010001; 88 user.Birthday = 1999-1-1; 89 obj.list.Add(user); 90 91 user = new UserInfo(); 92 user.ID = Guid.NewGuid().ToSt
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專職門(mén)衛(wèi)管理制度
- 業(yè)主樓道管理制度
- 業(yè)務(wù)層級(jí)管理制度
- 業(yè)務(wù)看板管理制度
- 東風(fēng)集團(tuán)管理制度
- 兩票三制管理制度
- 嚴(yán)查票證管理制度
- 嚴(yán)格按照管理制度
- 嚴(yán)格組織管理制度
- 中醫(yī)醫(yī)生管理制度
- GB/T 8478-2020鋁合金門(mén)窗
- GB/T 11363-2008釬焊接頭強(qiáng)度試驗(yàn)方法
- GB 12995-2006機(jī)動(dòng)輪椅車
- 40篇短文搞定高考英語(yǔ)3500詞
- 【山東】國(guó)際足球運(yùn)動(dòng)小鎮(zhèn)概念規(guī)劃方案
- 海氏(hay)職位分析法-介紹、實(shí)踐與評(píng)價(jià)合集課件
- 有趣的英漢互譯-課件
- (參考)菲達(dá)公司國(guó)內(nèi)電除塵器業(yè)績(jī)表
- 步進(jìn)式加熱爐耐材砌筑施工方案
- GB-T12232-2005- 通用閥門(mén) 法蘭連接鐵制閘閥
- 2022年中國(guó)電信店長(zhǎng)技能四級(jí)認(rèn)證教材
評(píng)論
0/150
提交評(píng)論