600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > C#实现实体类和XML相互转换

C#实现实体类和XML相互转换

时间:2022-09-27 14:03:00

相关推荐

C#实现实体类和XML相互转换

一、实体类转换成XML

将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化

public static string XmlSerialize<T>(T obj){using (StringWriter sw = new StringWriter()){Type t= obj.GetType(); XmlSerializer serializer = new XmlSerializer(obj.GetType());serializer.Serialize(sw, obj);sw.Close();return sw.ToString();}}

示例:

1、定义实体类

1[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]2[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]3public class Request4{5 6 public string System { get; set; }7 public string SecurityCode { get; set; }8 public PatientBasicInfo PatientInfo { get; set; }9}10 11/// <remarks/>12[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]13public partial class PatientBasicInfo14{15 public string PatientNo { get; set; }16 public string PatientName { get; set; }17 public string Phoneticize { get; set; }18 public string Sex { get; set; }19 public string Birth { get; set; }20 public string BirthPlace { get; set; }21 public string Country { get; set; }22 public string Nation { get; set; }23 public string IDNumber { get; set; }24 public string SecurityNo { get; set; }25 public string Workunits { get; set; }26 public string Address { get; set; }27 public string ZIPCode { get; set; }28 public string Phone { get; set; }29 public string ContactPerson { get; set; }30 public string ContactShip { get; set; }31 public string ContactPersonAdd { get; set; }32 public string ContactPersonPhone { get; set; }33 public string OperationCode { get; set; }34 public string OperationName { get; set; }35 public string OperationTime { get; set; }36 public string CardNo { get; set; }37 public string ChangeType { get; set; }38 39}

2、给实体类赋值,并通过序列化将实体类转换成XML格式的字符串

1 Request patientIn = new Request();2 patientIn.System = "HIS";3 patientIn.SecurityCode = "HIS5";4 5 PatientBasicInfo basicInfo = new PatientBasicInfo();6 basicInfo.PatientNo = "1234";7 basicInfo.PatientName = "测试";8 basicInfo.Phoneticize = "";9 basicInfo.Sex = "1";10 basicInfo.Birth = "";11 basicInfo.BirthPlace = "";12 basicInfo.Country = "";13 basicInfo.Nation = "";14 basicInfo.IDNumber = "";15 basicInfo.SecurityNo = "";16 basicInfo.Workunits = "";17 basicInfo.Address = "";18 basicInfo.ZIPCode = "";19 basicInfo.Phone = "";20 basicInfo.ContactShip = "";21 basicInfo.ContactPersonPhone = "";22 basicInfo.ContactPersonAdd = "";23 basicInfo.ContactPerson = "";24 basicInfo.ChangeType = "";25 basicInfo.CardNo = "";26 basicInfo.OperationCode = "";27 basicInfo.OperationName = "";28 basicInfo.OperationTime = "";29 30 patientIn.PatientInfo = basicInfo;31 32 //序列化33 string strxml = XmlSerializeHelper.XmlSerialize<Request>(patientIn);

3、生成的XML实例

1 <?xml version="1.0" encoding="utf-16"?>2 <Request xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema">3 <System>HIS</System>4 <SecurityCode>HIS5</SecurityCode>5 <PatientInfo>6<PatientNo>1234</PatientNo>7<PatientName>测试</PatientName>8<Phoneticize />9<Sex>1</Sex>10<Birth />11<BirthPlace />12<Country />13<Nation />14<IDNumber />15<SecurityNo />16<Workunits />17<Address />18<ZIPCode />19<Phone />20<ContactPerson />21<ContactShip />22<ContactPersonAdd />23<ContactPersonPhone />24<OperationCode />25<OperationName />26<OperationTime />27<CardNo />28<ChangeType />29 </PatientInfo>30 </Request>

二、将XML转换成实体类

把XML转换成相应的实体类,需要使用到XmlSerializer类的Deserialize方法,将XML进行反序列化。

1 public static T DESerializer<T>(string strXML) where T:class2 {3try4{5 using (StringReader sr = new StringReader(strXML))6 {7 XmlSerializer serializer = new XmlSerializer(typeof(T));8 return serializer.Deserialize(sr) as T;9 }10}11catch (Exception ex)12{13 return null;14}15 }

示例:

将上例中序列化后的XML反序列化成实体类

1 //反序列化2 Request r = XmlSerializeHelper.DESerializer<Request>(strxml);

三、将DataTable转换成XML

1 //将DataTable转换成XML2 DataTable dt = new DataTable("MyTable");3 //添加列4 dt.Columns.Add("Id", typeof(int));5 dt.Columns.Add("Name", typeof(string));6 dt.Columns.Add("Sex", typeof(char));7 //添加行8 dt.Rows.Add(1, "小明", '1');9 dt.Rows.Add(2, "小红", '2');10 dt.Rows.Add(3, "小王", '2');11 dt.Rows.Add(4, "测试", '2');12 //序列化,将DataTable转换成XML格式的字符串13 string strXML = XmlSerializeHelper.XmlSerialize <DataTable> (dt);

四、将XML转换成DataTable

1 //反序列化,将XML转换成字符串2 DataTable dtNew= XmlSerializeHelper.DESerializer<DataTable>(strXML);

五、将List集合转换成XML

/// <summary>/// 测试类/// </summary>public class Student{public int Id { get; set; }public string Name { get; set; }public char Sex { get; set; }public int Age { get; set; }}//测试集合List<Student> list = new List<Student>(){new Student(){Id=1,Name="小红",Sex='2',Age=20},new Student(){Id=2,Name="小明",Sex='1',Age=22},new Student(){Id=3,Name="小王",Sex='1',Age=19},new Student(){Id=4,Name="测试",Sex='2',Age=23}};//序列化string strXML = XmlSerializeHelper.XmlSerialize<List<Student>>(list);

六、将XML转换成集合

使用上面例子中集合转换成的XML进行反序列化。

1 //反序列化2 List<Student> listStu = XmlSerializeHelper.DESerializer<List<Student>>(strXML);

//**************************************

1、实体类与XML相互转换

将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化。

把XML转换成相应的实体类,需要使用到XmlSerializer类的Deserialize方法,将XML进行反序列化。

创建XML序列化公共处理类(XmlSerializeHelper.cs)

using System;

using System.IO;

using System.Xml.Serialization;

/// <summary>

/// XML序列化公共处理类

/// </summary>

public static class XmlSerializeHelper

{

/// <summary>

/// 将实体对象转换成XML

/// </summary>

/// <typeparam name="T">实体类型</typeparam>

/// <param name="obj">实体对象</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("将实体对象转换成XML异常", ex);

}

}

/// <summary>

/// 将XML转换成实体对象

/// </summary>

/// <typeparam name="T">实体类型</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转换成实体对象异常", ex);

}

}

}

创建用户信息类,用于示例使用。

/// <summary>

/// 用户信息类

/// </summary>

public class UserInfo

{

/// <summary>

/// 编号

/// </summary>

public int ID { get; set; }

/// <summary>

/// 名称

/// </summary>

public string Name { get; set; }

/// <summary>

/// 创建时间

/// </summary>

public DateTime? CreateTime { get; set; }

}

1.1 示例1:将List与XML相互转换

/// <summary>

/// 将List与XML相互转换

/// </summary>

public static void ListToXmlTest()

{

//获取用户列表

List<UserInfo> userList = GetUserList();

//将实体对象转换成XML

string xmlResult = XmlSerializeHelper.XmlSerialize(userList);

//将XML转换成实体对象

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结果:

<?xml version="1.0" encoding="utf-16"?>

<ArrayOfUserInfo xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema">

<UserInfo>

<ID>1</ID>

<Name>张三</Name>

<CreateTime>-10-04T15:59:53.7761027+08:00</CreateTime>

</UserInfo>

<UserInfo>

<ID>2</ID>

<Name>李四</Name>

<CreateTime>-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相互转换

/// <summary>

/// 将DataTable与XML相互转换

/// </summary>

public static void DataTableToXmlTest()

{

//创建DataTable对象

DataTable dt = CreateDataTable();

//将DataTable转换成XML

string xmlResult = XmlSerializeHelper.XmlSerialize(dt);

//将XML转换成DataTable

DataTable deResult = XmlSerializeHelper.DESerializer<DataTable>(xmlResult);

}

/// <summary>

/// 创建DataTable对象

/// </summary>

public static DataTable CreateDataTable()

{

//创建DataTable

DataTable dt = new DataTable("NewDt");

//创建自增长的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")));

//创建数据

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结果:

<?xml version="1.0" encoding="utf-16"?>

<DataTable>

<xs:schema id="NewDataSet" xmlns="" xmlns:xs="/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>-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>-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>-10-04T16:06:10.8004082+08:00</CreateTime>

</NewDt>

</DocumentElement>

</diffgr:diffgram>

</DataTable>

2、序列化常用Attribute讲解说明

[XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=false)]// 当该类为Xml根节点时,以此为根节点名称。

public class City

[XmlAttribute("AreaName")]// 表现为Xml节点属性。<... AreaName="..."/>

public string Name

[XmlElementAttribute("AreaId", IsNullable = false)]// 表现为Xml节点。<AreaId>...</AreaId>

public string Id

[XmlArrayAttribute("Areas")]// 表现为Xml层次结构,根为Areas,其所属的每个该集合节点元素名为类名。<Areas><Area ... /><Area ... /></Areas>

public Area[] Areas

[XmlElementAttribute("Area", IsNullable = false)]// 表现为水平结构的Xml节点。<Area ... /><Area ... />...

public Area[] Areas

[XmlIgnoreAttribute]// 忽略该元素的序列化。

把这些属性与model类的相关属性,配合使用,就可以自由设置相关XML的具体格式了。

综合示例:将班级信息序列化成XML

示例要求:

(1)每个XML节点以“My”开头。

(2)班级ID和学生ID字段以XML节点属性表现,其它字段以XML节点的形式表现。

(3)由于学生的邮箱涉及敏感信息,所以不参与序列化。

2.1 创建班级信息类(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>

/// 学生列表

/// </summary>

[XmlArrayAttribute("MyStudents")]

public List<Student> StudentList { get; set; }

}

2.2 创建学生信息类(Student.cs)

using System.Xml.Serialization;

/// <summary>

/// 学生信息类

/// </summary>

[XmlRootAttribute("MyStudent", IsNullable = false)]

public class Student

{

/// <summary>

/// 学生ID

/// </summary>

[XmlAttribute("MyStuID")]

public int StuID { get; set; }

/// <summary>

/// 学生名称

/// </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将班级信息转换成XML

/// <summary>

/// 将班级信息转换成XML

/// </summary>

public static void ClassInfoToXml()

{

//获取班级信息

ClassInfo classInfo = GetClassInfo();

//将班级信息转换成XML

string classXml = XmlSerializeHelper.XmlSerialize(classInfo);

}

/// <summary>

/// 获取班级信息

/// </summary>

public static ClassInfo GetClassInfo()

{

//创建班级信息

ClassInfo classInfo = new ClassInfo();

classInfo.ClassID = 1;

classInfo.ClassName = "高一(5)班";

classInfo.Teacher = "李老师";

//创建学生列表

List<Student> studentList = new List<Student>();

studentList.Add(new Student() { StuID = 1, StuName = "张三", Sex = "男", Email = "zhangsan@" });

studentList.Add(new Student() { StuID = 2, StuName = "李四", Sex = "女", Email = "lisi@" });

studentList.Add(new Student() { StuID = 3, StuName = "王五", Sex = "男", Email = "wangwu@" });

classInfo.StudentList = studentList;

return classInfo;

}

XML结果:

<?xml version="1.0" encoding="utf-16"?>

<MyClassInfo xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/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>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。