c#XML转换成实体
2018-03-27 14:59 会飞的雪鹿 阅读(2322) 评论(0) 编辑 收藏 举报首选:我的XML文件如下(mysql表里导出的):几千条,就选2条做例子。
<?xml version="1.0" encoding="utf-8" ?> <RECORDS> <RECORD> <CardId>13</CardId> <CardNo>DSL0000011</CardNo> <IdNo>321283198410201416</IdNo> <Name>林黛玉</Name> <BrithDay>1955/7/13</BrithDay> <Sex>M</Sex> <Phone></Phone> <Balance>3065.84</Balance> <Point>600</Point> <Level>普通卡</Level> <ActiveDeviceSN>98261720412341</ActiveDeviceSN> <ActiveStaffName>贾母</ActiveStaffName> <ActiveTime>2017/11/3 11:52:00</ActiveTime> <LatestUseTime>2017/12/19 10:37:14</LatestUseTime> <ExpireTime>2027/11/3 11:52:00</ExpireTime> <Status>0</Status> <CreateBy></CreateBy> <CreateTime>2017/11/3 11:52:00</CreateTime> <UpdateBy>1</UpdateBy> <UpdateTime>2017/11/3 14:15:04</UpdateTime> <IsDelete>0</IsDelete> </RECORD> <RECORD> <CardId>14</CardId> <CardNo>DSL0000011</CardNo> <IdNo>321283198410201416</IdNo> <Name>贾宝玉</Name> <BrithDay>1992/7/13</BrithDay> <Sex>M</Sex> <Phone></Phone> <Balance>36.15</Balance> <Point>200</Point> <Level>银卡</Level> <ActiveDeviceSN>98261720412341</ActiveDeviceSN> <ActiveStaffName>贾雨村</ActiveStaffName> <ActiveTime>2017/11/3 11:52:00</ActiveTime> <LatestUseTime>0001/1/1 00:00:00</LatestUseTime> <ExpireTime>2027/11/3 11:52:00</ExpireTime> <Status>0</Status> <CreateBy></CreateBy> <CreateTime>2017/11/3 11:52:00</CreateTime> <UpdateBy>1</UpdateBy> <UpdateTime>2017/11/3 14:15:04</UpdateTime> <IsDelete>0</IsDelete> </RECORD> </RECORDS>
建的实体类如下:
[XmlRoot("RECORDS")] public class SetDataModel { [XmlElement("RECORD")] public List<OldCard> Cards { get; set; } } [XmlType("RECORD")] public class OldCard { public int CardId { get; set; } public string CardNo { get; set; } public string IdNo { get; set; } public string Name { get; set; } public string Phone { get; set; } public decimal? Balance { get; set; } public int? Point { get; set; } public string Level { get; set; } public string ActiveDeviceSN { get; set; } public string ActiveStaffName { get; set; } [XmlElement("ActiveTime")] public string ActiveTime2 { get { return ActiveTime.Value.ToString("yyyy-MM-dd HH:mm:ss"); } set { ActiveTime = DateTime.Parse(value); } } [XmlIgnore] public Nullable<System.DateTime> ActiveTime { get; set; } [XmlElement("LatestUseTime")] public string LatestUseTime2 { get { return LatestUseTime.Value.ToString("yyyy-MM-dd HH:mm:ss"); } set { LatestUseTime = DateTime.Parse(value); } } [XmlIgnore] public Nullable<System.DateTime> LatestUseTime { get; set; } [XmlElement("ExpireTime")] public string ExpireTime2 { get { return ExpireTime.Value.ToString("yyyy-MM-dd HH:mm:ss"); } set { ExpireTime = DateTime.Parse(value); } } [XmlIgnore] public Nullable<System.DateTime> ExpireTime { get; set; } public int? Status { get; set; } [XmlElement("BrithDay")] public string BrithDay2 { get { return BrithDay.Value.ToString("yyyy-MM-dd HH:mm:ss"); } set { BrithDay = DateTime.Parse(value); } } [XmlIgnore] public DateTime? BrithDay { get; set; } public string StatusName { get; set; } [XmlElement("CreateBy")] public string CreateByStr { get { return CreateBy.ToString(); } set { if (value == "") CreateBy = 0; else CreateBy = Convert.ToInt32(value); } } [XmlIgnore] public int CreateBy { get; set; } [XmlElement("CreateTime")] public string CreateTime2 { get { return CreateTime.Value.ToString("yyyy-MM-dd HH:mm:ss"); } set { CreateTime = DateTime.Parse(value); } } [XmlIgnore] public Nullable<System.DateTime> CreateTime { get; set; } [XmlElement("UpdateBy")] public string UpdateByStr { get { return UpdateBy.ToString(); } set { if (value == "") UpdateBy = 0; else UpdateBy = Convert.ToInt32(value); } } [XmlIgnore] public Nullable<int> UpdateBy { get; set; } [XmlElement("UpdateTime")] public string UpdateTime2 { get { return UpdateTime.Value.ToString("yyyy-MM-dd HH:mm:ss"); } set { UpdateTime = DateTime.Parse(value); } } [XmlIgnore] public Nullable<System.DateTime> UpdateTime { get; set; } public bool IsDelete { get; set; } }
实体赋值的方法如下:
public void SetCardData() { //StreamReader sr = new StreamReader(@"d:\Card.json"); //string json = sr.ReadToEnd();
//var data = Newtonsoft.Json.JsonConvert.DeserializeObject<SetDataModel>(json); StreamReader sr = new StreamReader(@"d:\Card.xml"); string xml = sr.ReadToEnd(); sr.Close(); var data = DESerializer<SetDataModel>(xml); } 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) { return null; } }
困扰1:时间类型,转换直接报错
字符串“2017/11/3 11:52:00”不是有效的 AllXsd 值。
所以才要把
public Nullable<System.DateTime> CreateTime { get; set; }
写成:
[XmlElement("CreateTime")] public string CreateTime2 { get { return CreateTime.Value.ToString("yyyy-MM-dd HH:mm:ss"); } set { CreateTime = DateTime.Parse(value); } } [XmlIgnore] public Nullable<System.DateTime> CreateTime { get; set; }
困扰2:int类型xml不能为空 比如
<CreateBy></CreateBy>
为空 直接报错:输入字符串的格式不正确。
所以要把
public int CreateBy { get; set; }
写成:
[XmlElement("CreateBy")] public string CreateByStr { get { return CreateBy.ToString(); } set { if (value == "") CreateBy = 0; else CreateBy = Convert.ToInt32(value); } } [XmlIgnore] public int CreateBy { get; set; }