C#中實(shí)體類與XML相互轉(zhuǎn)換方式
1、實(shí)體類與XML相互轉(zhuǎn)換
將實(shí)體類轉(zhuǎn)換成XML需要使用XmlSerializer類的Serialize方法,將實(shí)體類序列化。
把XML轉(zhuǎn)換成相應(yīng)的實(shí)體類,需要使用到XmlSerializer類的Deserialize方法,將XML進(jìn)行反序列化。
創(chuàng)建XML序列化公共處理類(XmlSerializeHelper.cs)
using System;
using System.IO;
using System.Xml.Serialization;
/// <summary>
/// XML序列化公共處理類
/// </summary>
public static class XmlSerializeHelper
{
/// <summary>
/// 將實(shí)體對象轉(zhuǎn)換成XML
/// </summary>
/// <typeparam name="T">實(shí)體類型</typeparam>
/// <param name="obj">實(shí)體對象</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í)體對象轉(zhuǎn)換成XML異常", ex);
}
}
/// <summary>
/// 將XML轉(zhuǎn)換成實(shí)體對象
/// </summary>
/// <typeparam name="T">實(shí)體類型</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í)體對象異常", ex);
}
}
}創(chuàng)建用戶信息類,用于示例使用。
/// <summary>
/// 用戶信息類
/// </summary>
public class UserInfo
{
/// <summary>
/// 編號
/// </summary>
public int ID { get; set; }
/// <summary>
/// 名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 創(chuàng)建時間
/// </summary>
public DateTime? CreateTime { get; set; }
}1.1 示例1:將List與XML相互轉(zhuǎn)換
/// <summary>
/// 將List與XML相互轉(zhuǎn)換
/// </summary>
public static void ListToXmlTest()
{
//獲取用戶列表
List<UserInfo> userList = GetUserList();
//將實(shí)體對象轉(zhuǎn)換成XML
string xmlResult = XmlSerializeHelper.XmlSerialize(userList);
//將XML轉(zhuǎn)換成實(shí)體對象
List<UserInfo> deResult = XmlSerializeHelper.DESerializer<List<UserInfo>>(xmlResult);
}
/// <summary>
/// 獲取用戶信息列表
/// </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對象
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對象
/// </summary>
public static DataTable CreateDataTable()
{
//創(chuàng)建DataTable
DataTable dt = new DataTable("NewDt");
//創(chuà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講解說明
[XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=false)]?????// 當(dāng)該類為Xml根節(jié)點(diǎn)時,以此為根節(jié)點(diǎn)名稱。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,其所屬的每個該集合節(jié)點(diǎn)元素名為類名。<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類的相關(guān)屬性,配合使用,就可以自由設(shè)置相關(guān)XML的具體格式了。
綜合示例:將班級信息序列化成XML
示例要求:
(1)每個XML節(jié)點(diǎn)以“My”開頭。
(2)班級ID和學(xué)生ID字段以XML節(jié)點(diǎn)屬性表現(xiàn),其它字段以XML節(jié)點(diǎn)的形式表現(xiàn)。
(3)由于學(xué)生的郵箱涉及敏感信息,所以不參與序列化。
2.1 創(chuàng)建班級信息類(ClassInfo.cs)
using System.Collections.Generic;
using System.Xml.Serialization;
/// <summary>
/// 班級信息類
/// </summary>
[XmlRootAttribute("MyClassInfo", Namespace = "ABC_123", IsNullable = false)]
public class ClassInfo
{
/// <summary>
/// 班級ID
/// </summary>
[XmlAttribute("MyClassID")]
public int ClassID { get; set; }
/// <summary>
/// 班級名稱
/// </summary>
[XmlElementAttribute("MyClassName", IsNullable = false)]
public string ClassName { get; set; }
/// <summary>
/// 班長人
/// </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é)生信息類(Student.cs)
using System.Xml.Serialization;
/// <summary>
/// 學(xué)生信息類
/// </summary>
[XmlRootAttribute("MyStudent", IsNullable = false)]
public class Student
{
/// <summary>
/// 學(xué)生ID
/// </summary>
[XmlAttribute("MyStuID")]
public int StuID { get; set; }
/// <summary>
/// 學(xué)生名稱
/// </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 將班級信息轉(zhuǎn)換成XML
/// <summary>
/// 將班級信息轉(zhuǎn)換成XML
/// </summary>
public static void ClassInfoToXml()
{
//獲取班級信息
ClassInfo classInfo = GetClassInfo();
//將班級信息轉(zhuǎn)換成XML
string classXml = XmlSerializeHelper.XmlSerialize(classInfo);
}
/// <summary>
/// 獲取班級信息
/// </summary>
public static ClassInfo GetClassInfo()
{
//創(chuàng)建班級信息
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é)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決WPF附加屬性的Set函數(shù)不調(diào)用的問題
這篇文章介紹了解決WPF附加屬性的Set函數(shù)不調(diào)用的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
C# 如何調(diào)用C++ dll string類型返回
這篇文章主要介紹了C# 如何調(diào)用C++ dll string類型返回問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
C#連接ClickHouse數(shù)據(jù)庫的步驟指南
在 C# 中連接 ClickHouse 數(shù)據(jù)庫,您可以使用 ClickHouse.Client 庫,這個庫提供了對 ClickHouse 數(shù)據(jù)庫的高效訪問,以下是詳細(xì)的步驟指南,幫助您在 C# 項(xiàng)目中連接和操作 ClickHouse 數(shù)據(jù)庫,需要的朋友可以參考下2024-12-12
C#中實(shí)現(xiàn)輸入漢字獲取其拼音(漢字轉(zhuǎn)拼音)的2種方法
這篇文章主要介紹了C#中實(shí)現(xiàn)輸入漢字獲取其拼音(漢字轉(zhuǎn)拼音)的2種方法,本文分別給出了使用微軟語言包、手動編碼實(shí)現(xiàn)兩種實(shí)現(xiàn)方式,需要的朋友可以參考下2015-01-01
Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-01-01
C#中通過反射將枚舉元素加載到ComboBo的實(shí)現(xiàn)方法
本文主要介紹了C#中通過反射將枚舉元素加載到ComboBo的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09

