一、实体类转换成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)]
3 public class Request
4 {
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)]
13 public partial class PatientBasicInfo
14 {
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="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/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:class
2 {
3 try
4 {
5 using (StringReader sr = new StringReader(strXML))
6 {
7 XmlSerializer serializer = new XmlSerializer(typeof(T));
8 return serializer.Deserialize(sr) as T;
9 }
10 }
11 catch (Exception ex)
12 {
13 return null;
14 }
15 }
示例:
将上例中序列化后的XML反序列化成实体类
1 //反序列化
2 Request r = XmlSerializeHelper.DESerializer<Request>(strxml);
三、将DataTable转换成XML
1 //将DataTable转换成XML
2 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="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相互转换
-
/// <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="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)] // 当该类为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 = "[email protected]" });
-
studentList.Add(new Student() { StuID = 2, StuName = "李四", Sex = "女", Email = "[email protected]" });
-
studentList.Add(new Student() { StuID = 3, StuName = "王五", Sex = "男", Email = "[email protected]" });
-
classInfo.StudentList = studentList;
-
return classInfo;
-
}
XML结果:
-
<?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>