C#中實(shí)體類(lèi)與XML相互轉(zhuǎn)換方式
1、實(shí)體類(lèi)與XML相互轉(zhuǎn)換
將實(shí)體類(lèi)轉(zhuǎn)換成XML需要使用XmlSerializer類(lèi)的Serialize方法,將實(shí)體類(lèi)序列化。
把XML轉(zhuǎn)換成相應(yīng)的實(shí)體類(lèi),需要使用到XmlSerializer類(lèi)的Deserialize方法,將XML進(jìn)行反序列化。
創(chuàng)建XML序列化公共處理類(lèi)(XmlSerializeHelper.cs)
using System; using System.IO; using System.Xml.Serialization; /// <summary> /// XML序列化公共處理類(lèi) /// </summary> public static class XmlSerializeHelper { /// <summary> /// 將實(shí)體對(duì)象轉(zhuǎn)換成XML /// </summary> /// <typeparam name="T">實(shí)體類(lèi)型</typeparam> /// <param name="obj">實(shí)體對(duì)象</param> public static string XmlSerialize<T>(T obj) { try { using (StringWriter sw = new StringWriter()) { Type t = obj.GetType(); XmlSerializer serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(sw, obj); sw.Close(); return sw.ToString(); } } catch (Exception ex) { throw new Exception("將實(shí)體對(duì)象轉(zhuǎn)換成XML異常", ex); } } /// <summary> /// 將XML轉(zhuǎn)換成實(shí)體對(duì)象 /// </summary> /// <typeparam name="T">實(shí)體類(lèi)型</typeparam> /// <param name="strXML">XML</param> public static T DESerializer<T>(string strXML) where T : class { try { using (StringReader sr = new StringReader(strXML)) { XmlSerializer serializer = new XmlSerializer(typeof(T)); return serializer.Deserialize(sr) as T; } } catch (Exception ex) { throw new Exception("將XML轉(zhuǎn)換成實(shí)體對(duì)象異常", ex); } } }
創(chuàng)建用戶(hù)信息類(lèi),用于示例使用。
/// <summary> /// 用戶(hù)信息類(lèi) /// </summary> public class UserInfo { /// <summary> /// 編號(hào) /// </summary> public int ID { get; set; } /// <summary> /// 名稱(chēng) /// </summary> public string Name { get; set; } /// <summary> /// 創(chuàng)建時(shí)間 /// </summary> public DateTime? CreateTime { get; set; } }
1.1 示例1:將List與XML相互轉(zhuǎn)換
/// <summary> /// 將List與XML相互轉(zhuǎn)換 /// </summary> public static void ListToXmlTest() { //獲取用戶(hù)列表 List<UserInfo> userList = GetUserList(); //將實(shí)體對(duì)象轉(zhuǎn)換成XML string xmlResult = XmlSerializeHelper.XmlSerialize(userList); //將XML轉(zhuǎn)換成實(shí)體對(duì)象 List<UserInfo> deResult = XmlSerializeHelper.DESerializer<List<UserInfo>>(xmlResult); } /// <summary> /// 獲取用戶(hù)信息列表 /// </summary> public static List<UserInfo> GetUserList() { List<UserInfo> userList = new List<UserInfo>(); userList.Add(new UserInfo() { ID = 1, Name = "張三", CreateTime = DateTime.Now }); userList.Add(new UserInfo() { ID = 2, Name = "李四", CreateTime = DateTime.Now }); userList.Add(new UserInfo() { ID = 2, Name = "王五" }); return userList; }
XML結(jié)果:
<?xml version="1.0" encoding="utf-16"?> <ArrayOfUserInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <UserInfo> <ID>1</ID> <Name>張三</Name> <CreateTime>2018-10-04T15:59:53.7761027+08:00</CreateTime> </UserInfo> <UserInfo> <ID>2</ID> <Name>李四</Name> <CreateTime>2018-10-04T15:59:54.9571044+08:00</CreateTime> </UserInfo> <UserInfo> <ID>2</ID> <Name>王五</Name> <CreateTime xsi:nil="true" /> </UserInfo> </ArrayOfUserInfo>
1.2 示例2:將DataTable與XML相互轉(zhuǎn)換
/// <summary> /// 將DataTable與XML相互轉(zhuǎn)換 /// </summary> public static void DataTableToXmlTest() { //創(chuàng)建DataTable對(duì)象 DataTable dt = CreateDataTable(); //將DataTable轉(zhuǎn)換成XML string xmlResult = XmlSerializeHelper.XmlSerialize(dt); //將XML轉(zhuǎn)換成DataTable DataTable deResult = XmlSerializeHelper.DESerializer<DataTable>(xmlResult); } /// <summary> /// 創(chuàng)建DataTable對(duì)象 /// </summary> public static DataTable CreateDataTable() { //創(chuàng)建DataTable DataTable dt = new DataTable("NewDt"); //創(chuàng)建自增長(zhǎng)的ID列 DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32")); dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String"))); dt.Columns.Add(new DataColumn("CreateTime", Type.GetType("System.DateTime"))); //創(chuàng)建數(shù)據(jù) DataRow dr = dt.NewRow(); dr["ID"] = 1; dr["Name"] = "張三"; dr["CreateTime"] = DateTime.Now; dt.Rows.Add(dr); dr = dt.NewRow(); dr["ID"] = 2; dr["Name"] = "李四"; dr["CreateTime"] = DateTime.Now; dt.Rows.Add(dr); dr = dt.NewRow(); dr["ID"] = 3; dr["Name"] = "王五"; dr["CreateTime"] = DateTime.Now; dt.Rows.Add(dr); return dt; }
XML結(jié)果:
<?xml version="1.0" encoding="utf-16"?> <DataTable> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="NewDt" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="NewDt"> <xs:complexType> <xs:sequence> <xs:element name="ID" type="xs:int" minOccurs="0" /> <xs:element name="Name" type="xs:string" minOccurs="0" /> <xs:element name="CreateTime" type="xs:dateTime" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <DocumentElement> <NewDt diffgr:id="NewDt1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> <ID>1</ID> <Name>張三</Name> <CreateTime>2018-10-04T16:06:10.8004082+08:00</CreateTime> </NewDt> <NewDt diffgr:id="NewDt2" msdata:rowOrder="1" diffgr:hasChanges="inserted"> <ID>2</ID> <Name>李四</Name> <CreateTime>2018-10-04T16:06:10.8004082+08:00</CreateTime> </NewDt> <NewDt diffgr:id="NewDt3" msdata:rowOrder="2" diffgr:hasChanges="inserted"> <ID>3</ID> <Name>王五</Name> <CreateTime>2018-10-04T16:06:10.8004082+08:00</CreateTime> </NewDt> </DocumentElement> </diffgr:diffgram> </DataTable>
2、序列化常用Attribute講解說(shuō)明
[XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=false)]?????// 當(dāng)該類(lèi)為Xml根節(jié)點(diǎn)時(shí),以此為根節(jié)點(diǎn)名稱(chēng)。public class City [XmlAttribute("AreaName")]????// 表現(xiàn)為Xml節(jié)點(diǎn)屬性。<... AreaName="..."/>public string Name [XmlElementAttribute("AreaId", IsNullable = false)]????// 表現(xiàn)為Xml節(jié)點(diǎn)。<AreaId>...</AreaId>public string Id [XmlArrayAttribute("Areas")]????// 表現(xiàn)為Xml層次結(jié)構(gòu),根為Areas,其所屬的每個(gè)該集合節(jié)點(diǎn)元素名為類(lèi)名。<Areas><Area ... /><Area ... /></Areas>public Area[] Areas [XmlElementAttribute("Area", IsNullable = false)]????// 表現(xiàn)為水平結(jié)構(gòu)的Xml節(jié)點(diǎn)。<Area ... /><Area ... />...public Area[] Areas [XmlIgnoreAttribute]????// 忽略該元素的序列化。
把這些屬性與model類(lèi)的相關(guān)屬性,配合使用,就可以自由設(shè)置相關(guān)XML的具體格式了。
綜合示例:將班級(jí)信息序列化成XML
示例要求:
(1)每個(gè)XML節(jié)點(diǎn)以“My”開(kāi)頭。
(2)班級(jí)ID和學(xué)生ID字段以XML節(jié)點(diǎn)屬性表現(xiàn),其它字段以XML節(jié)點(diǎn)的形式表現(xiàn)。
(3)由于學(xué)生的郵箱涉及敏感信息,所以不參與序列化。
2.1 創(chuàng)建班級(jí)信息類(lèi)(ClassInfo.cs)
using System.Collections.Generic; using System.Xml.Serialization; /// <summary> /// 班級(jí)信息類(lèi) /// </summary> [XmlRootAttribute("MyClassInfo", Namespace = "ABC_123", IsNullable = false)] public class ClassInfo { /// <summary> /// 班級(jí)ID /// </summary> [XmlAttribute("MyClassID")] public int ClassID { get; set; } /// <summary> /// 班級(jí)名稱(chēng) /// </summary> [XmlElementAttribute("MyClassName", IsNullable = false)] public string ClassName { get; set; } /// <summary> /// 班長(zhǎng)人 /// </summary> [XmlElementAttribute("MyTeacher", IsNullable = false)] public string Teacher { get; set; } /// <summary> /// 學(xué)生列表 /// </summary> [XmlArrayAttribute("MyStudents")] public List<Student> StudentList { get; set; } }
2.2 創(chuàng)建學(xué)生信息類(lèi)(Student.cs)
using System.Xml.Serialization; /// <summary> /// 學(xué)生信息類(lèi) /// </summary> [XmlRootAttribute("MyStudent", IsNullable = false)] public class Student { /// <summary> /// 學(xué)生ID /// </summary> [XmlAttribute("MyStuID")] public int StuID { get; set; } /// <summary> /// 學(xué)生名稱(chēng) /// </summary> [XmlElementAttribute("MyStuName", IsNullable = false)] public string StuName { get; set; } /// <summary> /// 性別 /// </summary> [XmlElementAttribute("MySex", IsNullable = false)] public string Sex { get; set; } /// <summary> /// 郵箱 /// </summary> [XmlIgnoreAttribute] public string Email { get; set; } }
2.3 將班級(jí)信息轉(zhuǎn)換成XML
/// <summary> /// 將班級(jí)信息轉(zhuǎn)換成XML /// </summary> public static void ClassInfoToXml() { //獲取班級(jí)信息 ClassInfo classInfo = GetClassInfo(); //將班級(jí)信息轉(zhuǎn)換成XML string classXml = XmlSerializeHelper.XmlSerialize(classInfo); } /// <summary> /// 獲取班級(jí)信息 /// </summary> public static ClassInfo GetClassInfo() { //創(chuàng)建班級(jí)信息 ClassInfo classInfo = new ClassInfo(); classInfo.ClassID = 1; classInfo.ClassName = "高一(5)班"; classInfo.Teacher = "李老師"; //創(chuàng)建學(xué)生列表 List<Student> studentList = new List<Student>(); studentList.Add(new Student() { StuID = 1, StuName = "張三", Sex = "男", Email = "zhangsan@mail.com" }); studentList.Add(new Student() { StuID = 2, StuName = "李四", Sex = "女", Email = "lisi@mail.com" }); studentList.Add(new Student() { StuID = 3, StuName = "王五", Sex = "男", Email = "wangwu@mail.com" }); classInfo.StudentList = studentList; return classInfo; }
XML結(jié)果:
<?xml version="1.0" encoding="utf-16"?> <MyClassInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" MyClassID="1" xmlns="ABC_123"> <MyClassName>高一(5)班</MyClassName> <MyTeacher>李老師</MyTeacher> <MyStudents> <Student MyStuID="1"> <MyStuName>張三</MyStuName> <MySex>男</MySex> </Student> <Student MyStuID="2"> <MyStuName>李四</MyStuName> <MySex>女</MySex> </Student> <Student MyStuID="3"> <MyStuName>王五</MyStuName> <MySex>男</MySex> </Student> </MyStudents> </MyClassInfo>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決WPF附加屬性的Set函數(shù)不調(diào)用的問(wèn)題
這篇文章介紹了解決WPF附加屬性的Set函數(shù)不調(diào)用的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06C# 如何調(diào)用C++ dll string類(lèi)型返回
這篇文章主要介紹了C# 如何調(diào)用C++ dll string類(lèi)型返回問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C#中DateTime的時(shí)間加減法操作小結(jié)
本文主要介紹了C#中DateTime的時(shí)間加減法操作小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C#連接ClickHouse數(shù)據(jù)庫(kù)的步驟指南
在 C# 中連接 ClickHouse 數(shù)據(jù)庫(kù),您可以使用 ClickHouse.Client 庫(kù),這個(gè)庫(kù)提供了對(duì) ClickHouse 數(shù)據(jù)庫(kù)的高效訪(fǎng)問(wèn),以下是詳細(xì)的步驟指南,幫助您在 C# 項(xiàng)目中連接和操作 ClickHouse 數(shù)據(jù)庫(kù),需要的朋友可以參考下2024-12-12C#中實(shí)現(xiàn)輸入漢字獲取其拼音(漢字轉(zhuǎn)拼音)的2種方法
這篇文章主要介紹了C#中實(shí)現(xiàn)輸入漢字獲取其拼音(漢字轉(zhuǎn)拼音)的2種方法,本文分別給出了使用微軟語(yǔ)言包、手動(dòng)編碼實(shí)現(xiàn)兩種實(shí)現(xiàn)方式,需要的朋友可以參考下2015-01-01Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01C#中通過(guò)反射將枚舉元素加載到ComboBo的實(shí)現(xiàn)方法
本文主要介紹了C#中通過(guò)反射將枚舉元素加載到ComboBo的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09