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)]3 public 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)] 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:class2 {3 try4 {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转换成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="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 = "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结果:
<?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>
C#实现实体类和XML相互转换相关推荐
- java实体类转换xml_简单实体类和xml文件的相互转换方法
最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简 ...
- java中element转换_java中实体类与xml的element相互转换
import org.w3c.dom.Document; import org.w3c.dom.Element; /** * @ClassName: DemoConvert * @Author: 个人 ...
- JAVA Spring 简单的配置和操作 ( 创建实体类, 配置XML文件, 调试 )
< 1 > 实体类 Person package java_spring.modle;/*** 一个实体类( Person )*/ public class Person {private ...
- Xml转Java实体类对象 xml转Javabena 对象 且多级嵌套 复杂嵌套
最近在做企微开发,遇到了一个比较复杂的xml然后要去我将xml转成实体类 xml如下 <xml><ToUserName><![CDATA[toUser]]>< ...
- Castor简单介绍实体类和xml互转
本节摘要:本节主要介绍Castor插件的使用. https://www.cnblogs.com/java-pan/archive/2012/04/18/castor.html preparation ...
- c语言xml序列化,C# XML和实体类之间相互转换(序列化和反序列化)
我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...
- xml转json和实体类的两种方式
本文为博主原创,未经允许不得转载: xml在http通信中具有较高的安全性和传输速度,所以应用比较广泛, 在项目中往往需要对xml,json和实体类进行相互转换,在这里总结一下自己所用到的一些方法: ...
- java xml 实体类_java中的xml与实体类之间的映射
实体类: package xml; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class User ...
- mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)
若采用mybatis框架,数据库新建表,手动编写的话,需要编写大量的实体类.mapper文件.mapper.xml文件,都是一些重复且有规律的工作. 我们可以引用插件,然后做配置,自动生成这些文件,提 ...
最新文章
- c#_委托事件的理解
- linux进程VSZ(虚拟内存)
- 在 ASP.NET Core 中执行租户服务
- 前端学习(3125):react-hello-react之类式组件里的构造器域props
- Python生成词云
- SAP固定资产业务场景及方案
- 从0开始的技术美术之路(十)伽马校正
- 最小二乘法曲线拟合的c++实现
- openfeign配置代理服务器
- 阿里云服务器为何价格比较贵?
- ssh secure 安装mysql_centos7 安装mysql
- 微信小程序 录像 录视频
- Jenkins系列之——前言 Jenkins初识
- 用c 语言循环抓取网页,C语言获取网页源代码
- 电脑文件夹备份到百度网盘,可以实现自动备份
- jt2go嵌入html控件,JT2Go(JT文件阅读器) 免费版v11.2
- SHH 工具 隧道窗格
- 【STM32F407开发板用户手册】第27章 STM32F407的定时器应用之TIM1-TIM14的PWM实现
- 智慧城市项目实施经验
- python2安装tensorflow,tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
热门文章
- python api 示例_Python简单接口测试实例
- springboot使用imageio返回图片_SpringBoot 二维码生成(复制即用)
- UE4学习-场景介绍、基本操作、快捷键
- udp 传输文件 java_Java 网络编程 之 UDP 文件传输
- java的回文是什么_Java实现回文判断
- 刷breed 极路由3_路由器接入usb打印机制作无线打印机服务器
- 提取某一个镇的行政边界_接口测试:A04_HttpRunner通用_02_提取数据_02_regex方式
- gitlab 开源项目 星_Docker实战之Gitlab搭建
- 【火爆全网,好评如潮】DS100手持示波器现货发售拉,附原子哥发布会详细讲解视频以及宣传视频...
- julia有 pytorch包吗_用 PyTorch 实现基于字符的循环神经网络 | Linux 中国