日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
談?wù)剬?duì)象和XML文件的轉(zhuǎn)換

很多時(shí)候,我們開發(fā)程序都需要使用到對(duì)象的XML序列化和反序列化,對(duì)象的XML序列化和反序列化,既可以使用XML對(duì)象(XmlDocument )進(jìn)行操作,也可以使用XmlSerializer進(jìn)行操作,兩個(gè)各有優(yōu)點(diǎn),就操作性而已,我傾向于使用后者來(lái)操作XML。

創(chuàng)新互聯(lián)是一家專業(yè)提供紅橋企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、成都做網(wǎng)站、html5、小程序制作等業(yè)務(wù)。10年已為紅橋眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

本文介紹三種方式操作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é)果如下所示。

 
 
 
  1.  
  2. Root Text  
  3.     The text of the sample element  
  4.  

#p#

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

注意其中代碼    

 
 
 
  1. XmlSerializerNamespaces ns = new XmlSerializerNamespaces();  
  2. ns.Add("", ""); 

是把默認(rèn)的xmlns命名空間多余的內(nèi)容去掉,這樣得到比較干凈的XML。

在使用的時(shí)候,我們需要定義好對(duì)象的實(shí)體,這樣才能給予對(duì)象進(jìn)行操作,定義的實(shí)體類如下所示。

 
 
 
  1. [Serializable]  
  2.     public class UserInfo  
  3.     {                  
  4.         public string ID { get; set; }  
  5.         public string UserNo{ get; set; }  
  6.         public string UserName { get; set; }  
  7.         public string Sex { get; set; }  
  8.         public string Birthday { get; set; }  
  9.     }  
  10.  
  11.     [Serializable]  
  12.     public class DataOfUser  
  13.     {  
  14.         [XmlElement(ElementName = "m_User")]  
  15.         public List list = new List();  
  16.     } 

調(diào)用序列化函數(shù)的代碼例子如下所示

 
 
 
  1. private void btnUserNormal_Click(object sender, EventArgs e)  
  2.         {  
  3.             DataOfUser obj = new DataOfUser();  
  4.             UserInfo user = new UserInfo();  
  5.             user.ID=Guid.NewGuid().ToString();  
  6.             user.Sex = "男";  
  7.             user.UserName = "張三";  
  8.             user.UserNo = "20010001";  
  9.             user.Birthday = "1999-1-1";  
  10.             obj.list.Add(user);  
  11.  
  12.             user = new UserInfo();  
  13.             user.ID = Guid.NewGuid().ToString();  
  14.             user.Sex = "女";  
  15.             user.UserName = "李氏";  
  16.             user.UserNo = "20020001";  
  17.             user.Birthday = "1998-1-1";  
  18.             obj.list.Add(user);  
  19.  
  20.             try 
  21.             {  
  22.                 XmlSerialize("C:\\User.xml", obj, obj.GetType());  
  23.                 MessageUtil.ShowTips("Ok");  
  24.             }  
  25.             catch (Exception ex)  
  26.             {  
  27.                 MessageUtil.ShowError(ex.Message);  
  28.             }  
  29.         } 

這樣得到的XML內(nèi)容如下所示。

 
 
 
  1.  
  2.  
  3.    
  4.     f8a8b323-5c56-4c21-9ddf-1cd30f78dfca 
  5.     20010001 
  6.     張三 
  7.      
  8.     1999-1-1 
  9.    
  10.    
  11.     bbb36378-ec27-4e20-ad4b-2d2dc7e142e4 
  12.     20020001 
  13.     李氏 
  14.      
  15.     1998-1-1 
  16.    
  17.  

反序列化的操作也比較簡(jiǎn)單,不再贅述。

#p#

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)用和前面沒有加密的差不多,如下所示。

 
 
 
  1. private void btnUserEncrypt_Click(object sender, EventArgs e)  
  2.         {  
  3.             DataOfUser obj = new DataOfUser();  
  4.             UserInfo user = new UserInfo();  
  5.             user.ID = Guid.NewGuid().ToString();  
  6.             user.Sex = "男";  
  7.             user.UserName = "張三";  
  8.             user.UserNo = "20010001";  
  9.             user.Birthday = "1999-1-1";  
  10.             obj.list.Add(user);  
  11.  
  12.             user = new UserInfo();  
  13.             user.ID = Guid.NewGuid().ToString();  
  14.             user.Sex = "女";  
  15.             user.UserName = "李氏";  
  16.             user.UserNo = "20020001";  
  17.             user.Birthday = "1998-1-1";  
  18.             obj.list.Add(user);  
  19.  
  20.             try  
  21.             {  
  22.                 XmlSerializeEncrypt("C:\\User-Encrypt.xml", obj, obj.GetType());  
  23.                 MessageUtil.ShowTips("Ok");  
  24.             }  
  25.             catch (Exception ex)  
  26.             {  
  27.                 MessageUtil.ShowError(ex.Message);  
  28.             }  
  29.         }  
  30.  
  31.         private void btnUserDecrypt_Click(object sender, EventArgs e)  
  32.         {  
  33.             string file = FileDialogHelper.OpenFile();  
  34.             if (!string.IsNullOrEmpty(file))  
  35.             {  
  36.                 DataOfUser info = XmlDeserializeDecrypt(file, typeof(DataOfUser)) as DataOfUser;  
  37.                 if (info != null)  
  38.                 {  
  39.                     MessageUtil.ShowTips("OK");  
  40.                 }  
  41.             }  
  42.         } 

 


本文題目:談?wù)剬?duì)象和XML文件的轉(zhuǎn)換
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/dpgiods.html