c# XML和實體類之間相互轉換(序列化和反序列化)

ggkwk 9年前發布 | 2K 次閱讀 C#

    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  
}  </pre> 


    / 實體對象轉換到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());  
}  </pre> 


    protected void Page_Load(object sender, EventArgs e)
{
string strTest = @"<Relationships>
<VariationParent xmlns=';
<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://www.microsoft.com/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://www.microsoft.com/schema/Products/2011-10-01\"", "");  
    return xml;  
}  </pre> 


 本文由用戶 ggkwk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!