好得很程序员自学网

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

C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下:

?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Data;

using System.Xml;

using System.Xml.Serialization;

/// <summary>

/// Xml序列化与反序列化

/// </summary>

public class XmlUtil

{

   #region 反序列化

   /// <summary>

   /// 反序列化

   /// </summary>

   /// <param name="type">类型</param>

   /// <param name="xml">XML字符串</param>

   /// <returns></returns>

   public static object Deserialize(Type type, string xml)

   {

     try

     {

       using (StringReader sr = new StringReader(xml))

       {

         XmlSerializer xmldes = new XmlSerializer(type);

         return xmldes.Deserialize(sr);

       }

     }

     catch (Exception e)

     {

       return null ;

     }

   }

   /// <summary>

   /// 反序列化

   /// </summary>

   /// <param name="type"></param>

   /// <param name="xml"></param>

   /// <returns></returns>

   public static object Deserialize(Type type, Stream stream)

   {

     XmlSerializer xmldes = new XmlSerializer(type);

     return xmldes.Deserialize(stream);

   }

   #endregion

   #region 序列化

   /// <summary>

   /// 序列化

   /// </summary>

   /// <param name="type">类型</param>

   /// <param name="obj">对象</param>

   /// <returns></returns>

   public static string Serializer(Type type, object obj)

   {

     MemoryStream Stream = new MemoryStream();

     XmlSerializer xml = new XmlSerializer(type);

     try

     {

       //序列化对象

       xml.Serialize(Stream, obj);

     }

     catch (InvalidOperationException)

     {

       throw ;

     }

     Stream.Position = 0;

     StreamReader sr = new StreamReader(Stream);

     string str = sr.ReadToEnd();

     sr.Dispose();

     Stream.Dispose();

     return str;

   }

   #endregion

}

?

/* 实体对象转换到Xml */

public class Student

{

   public string Name { set ; get ; }

   public int Age { set ; get ; }

}

Student stu1 = new Student() { Name = "okbase" , Age = 10 };

string xml = XmlUtil.Serializer( typeof (Student), stu1);

Console.Write(xml);

/* Xml转换到实体对象 */

Student stu2 = XmlUtil.Deserialize( typeof (Student), xml) as Student;

Console.Write( string .Format( "名字:{0},年龄:{1}" , stu2.Name, stu2.Age));

/* DataTable转换到Xml */

// 生成DataTable对象用于测试

DataTable dt1 = new DataTable( "mytable" );  // 必须指明DataTable名称

dt1.Columns.Add( "Dosage" , typeof ( int ));

dt1.Columns.Add( "Drug" , typeof ( string ));

dt1.Columns.Add( "Patient" , typeof ( string ));

dt1.Columns.Add( "Date" , typeof (DateTime));

// 添加行

dt1.Rows.Add(25, "Indocin" , "David" , DateTime.Now);

dt1.Rows.Add(50, "Enebrel" , "Sam" , DateTime.Now);

dt1.Rows.Add(10, "Hydralazine" , "Christoff" , DateTime.Now);

dt1.Rows.Add(21, "Combivent" , "Janet" , DateTime.Now);

dt1.Rows.Add(100, "Dilantin" , "Melanie" , DateTime.Now);

// 序列化

xml = XmlUtil.Serializer( typeof (DataTable), dt1);

Console.Write(xml);

/* Xml转换到DataTable */

// 反序列化

DataTable dt2 = XmlUtil.Deserialize( typeof (DataTable), xml) as DataTable;

// 输出测试结果

foreach (DataRow dr in dt2.Rows)

{

   foreach (DataColumn col in dt2.Columns)

   {

     Console.Write(dr[col].ToString() + " " );

   }

   Console.Write( "\r\n" );

}

/* List转换到Xml */

// 生成List对象用于测试

List<Student> list1 = new List<Student>(3);

list1.Add( new Student() { Name = "okbase" , Age = 10 });

list1.Add( new Student() { Name = "csdn" , Age = 15 });

// 序列化

xml = XmlUtil.Serializer( typeof (List<Student>), list1);

Console.Write(xml);

/* Xml转换到List */

List<Student> list2 = XmlUtil.Deserialize( typeof (List<Student>), xml) as List<Student>;

foreach (Student stu in list2)

{

   Console.WriteLine(stu.Name + "," + stu.Age.ToString());

}

?

protected void Page_Load( object sender, EventArgs e)

{

   string strTest = @"<Relationships>

    <VariationParent xmlns='http://HdhCmsTestmicrosoft测试数据/schema/Products/2011-10-01'>

     <Identifiers>

      <MarketplaceASIN>

       <MarketplaceId>ATVPDKIKX0DER</MarketplaceId>

       <ASIN>B00K69WURQ</ASIN>

      </MarketplaceASIN>

      <MarketplaceASIN>

       <MarketplaceId>TBVPDKIKX0DER</MarketplaceId>

       <ASIN>C00K69WURQ</ASIN>

      </MarketplaceASIN>

      <MarketplaceASIN>

       <MarketplaceId>KlVPDKIKX0DER</MarketplaceId>

       <ASIN>D00K69WURQ</ASIN>

      </MarketplaceASIN>

     </Identifiers>

    </VariationParent>

   </Relationships>" ;

   TextBox1.Text = "" ;

   XmlDocument doc = new XmlDocument();

   doc.LoadXml(strTest);

   XmlElement root = doc.DocumentElement;

   //用于带命名空间的XML操作

   XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);

   nsmgr.AddNamespace( "ab" , "http://HdhCmsTestmicrosoft测试数据/schema/Products/2011-10-01" );

   XmlNodeList macthNodes = root.SelectNodes( "//ab:Identifiers/ab:MarketplaceASIN" , nsmgr);

   for ( int i = 0; i < macthNodes.Count; i++)

   {

     //删除生成的命名空间,生成标准XML。

     string matchNode = CleanXmlnsTag(macthNodes[i].OuterXml);

     MarketplaceASIN ma = XmlUtil.Deserialize( typeof (MarketplaceASIN), matchNode) as MarketplaceASIN;

     if (ma != null )

     {

       Response.Write(ma.MarketplaceId + "---------" + ma.ASIN + "<br/>" );

     }

   }

}

/* 实体对象 */

public class MarketplaceASIN

{

   public string MarketplaceId { set ; get ; }

   public string ASIN { set ; get ; }

}

protected string CleanXmlnsTag( string xml)

{

   xml = xml.Replace( "xmlns=\"http://HdhCmsTestmicrosoft测试数据/schema/Products/2011-10-01\"" , "" );

   return xml;

}

希望本文所述对大家C#程序设计有所帮助。

dy("nrwz");

查看更多关于C#实现XML与实体类之间相互转换的方法(序列化与反序列化)的详细内容...

  阅读:53次