博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类...
阅读量:6816 次
发布时间:2019-06-26

本文共 21187 字,大约阅读时间需要 70 分钟。

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML

本节导读:本节主要介绍通过序列化接口IXmlSerializable实现XML序列化和反序列化,整理了XML基础操作及序列化的通用类(包括XML及节点的基础读写操作,XML到DataSet\DataTable互转换操作,XML序列化及反序列化通用方法等)。 

读前必备:

A.类和类的实例  

B.类的成员        

C.数组与集合    

D.泛型             

E.LINQ使用     

1. 通过序列化接口IXmlSerializable实现XML序列化

   命名空间:System.Xml.Serialization

   接口:IXmlSerializable

   方法:

   XmlSchema GetSchema();

   void ReadXml(XmlReader reader);

   void WriteXml(XmlWriter writer);

下面通过示例介绍关于序列化接口的使用,还是通过博客园文章为例:

定义文章实体类及文章调用方法: 

public class MyBlogs{    ///     /// 获取我的博客园中文章    ///     /// 
public static List
GetMyArticle(int count) { var document = XDocument.Load( "http://wcf.open.cnblogs.com/blog/u/yubinfeng/posts/1/" + count ); List
myArticleList = new List
(); var elements = document.Root.Elements(); //在进行这个工作之前,我们先获取我博客中的文章列表 var result = elements.Where(m => m.Name.LocalName == "entry").Select(myArticle => new MyArticle { id = Convert.ToInt32(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "id").Value), title = myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "title").Value, published = Convert.ToDateTime(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "published").Value), updated = Convert.ToDateTime(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "updated").Value), diggs = Convert.ToInt32(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "diggs").Value), views = Convert.ToInt32(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "views").Value), comments = Convert.ToInt32(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "comments").Value), summary = myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "summary").Value, link = myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "link").Attribute("href").Value, author = myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "author").Elements().SingleOrDefault(x => x.Name.LocalName == "name").Value }).OrderByDescending(m => m.published); myArticleList.AddRange(result); return myArticleList; }}///
public class MyArticle{ ///
/// 文章编号 /// public int id { get; set; } ///
/// 文章标题 /// public string title { get; set; } ///
/// 文章摘要 /// public string summary { get; set; } ///
/// 发布时间 /// public DateTime published { get; set; } ///
/// 最后更新时间 /// public DateTime updated { get; set; } ///
/// URL地址 /// public string link { get; set; } ///
/// 推荐数 /// public int diggs { get; set; } ///
/// 浏览量 /// public int views { get; set; } ///
/// 评论数 /// public int comments { get; set; } ///
/// 作者 /// public string author { get; set; }}

XML通过接口序列化和反序列化的方法

/// /// 序列化XML 对象=》XML文本/// 下面注释项,可根据需要使用/// /// /// 
public static string ObjectToXmlSerializer(Object Obj){ string XmlString = ""; XmlWriterSettings settings = new XmlWriterSettings(); //settings.OmitXmlDeclaration = true;//去除xml声明 settings.Encoding = Encoding.Default;//使用默认编码 //settings.IndentChars = "--"; //使用指定字符缩进 settings.Indent = true; //换行缩进 using (System.IO.MemoryStream mem = new MemoryStream()) { using (XmlWriter writer = XmlWriter.Create(mem, settings)) { //去除默认命名空间xmlns:xsd和xmlns:xsi XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer formatter = new XmlSerializer(Obj.GetType()); formatter.Serialize(writer, Obj, ns); } XmlString = Encoding.Default.GetString(mem.ToArray()); } return XmlString;}/// /// 反序列化 XML文本=》对象 /// ///
/// ///
public static T ObjectToXmlDESerializer
(string str) where T : class{ object obj; using (System.IO.MemoryStream mem = new MemoryStream(Encoding.Default.GetBytes(str))) { using (XmlReader reader = XmlReader.Create(mem)) { XmlSerializer formatter = new XmlSerializer(typeof(T)); obj = formatter.Deserialize(reader); } } return obj as T;}

调用如下:

//命名空间:System.Xml.Serialization//接口:IXmlSerializable//方法:XmlSchema GetSchema();void ReadXml(XmlReader reader);void WriteXml(XmlWriter writer);//(1)获取我博客园中最后10篇文章 (实际上这个过程也是反序列化)List
myArticleList = MyBlogs.GetMyArticle(10);//序列化并输出XML文本string xmlString = ObjectToXmlSerializer(myArticleList);Console.Write(xmlString);//序列化XML文本,遍历输出对象 List
myNewArticleList = ObjectToXmlDESerializer
>(xmlString);//遍历输出反序化的新对象myNewArticleListmyNewArticleList.ForEach(m => Console.WriteLine("文章编号:" + m.id + "\n文章标题:" + m.title));

运行结果如下:

 

 2. XML类

我们在序列化XML的时候,经常要操作XML,下面我列出XML类的一些成员,供参考查阅

XML操作的命名空间:System.Xml;

名称

描述

XmlAttribute

表示一个特性对象的集合,这些对象控制XmlSerializer如何序列化和反序列化对象

XmlArrayAttribute

指定XmlSerializer应将特定的类成员序列化为XML元素数组

XmlArrayItemAttribute

指定XmlSerializer可以放置在序列化数组中的派生类型

XmlArrayItemAttributes

表示XmlArrayItemAttribute对象的集合

XmlAttributeAttribute

指定XmlSerializer应将类成员作为XML特性序列化

XmlChoiceIdentifierAttribute

指定可以通过使用枚举来进一步消除成员的歧义

XmlElementAttribute

XmlSerializer序列化或反序列化包含对象时,指示公共字段或属性表示XML元素

XmlElementAttributes

表示XmlElementAttribute的集合,XmlSerializer将其用于它重写序列化类的默认方式

XmlEnumAttribute

控制XmlSerializer如何序列化枚举成员

XmlIgnoreAttribute

指示XmlSerializer方法不序列化公共字段或公共读/写属性值

XmlIncludeAttribute

允许XmlSerializer在它序列化或反序列化对象时识别类型

XmlRootAttribute

控制视为XML根元素的属性目标的XML序列化

XmlTextAttribute

当序列化或反序列化时,想XmlSerializer指示应将此成员作为XML文本处理

XmlTypeAttribute

控制当属性目标由XmlSerializer序列化时生成的XML结构

XmlAnyAttributeAttribute

指定成员(返回XmlAttribute对象的数组的字段)可以包含XML属性

XmlAnyElementAttribute

指定成员可以包含对象,该对象表示在序列化或反序列化的对象中没有相应成员的所有XML元素

XmlAnyElementAttributes

表示XmlAnyElementAttribute对象的集合

XmlAttributeEventArgs

UnKnowAttribute提供数据

XmlAttributeOverrides

允许你在使用XmlSerializer序列化或反序列化时重写属性、字段和类特性

XmlElementEventArgs

UnknownElement事件提供数据

XmlNamespaceDeclarationsAttribute

指定目标属性、参数、返回值或类成员包含与XML文档中所用命名空间关联的前缀

XmlNodeEventArgs

UnknownNode时间提供数据

XmlSerializer

将对象序列化到XML文档中和从XML文档中反序列化对象,XmlSerializer使你得以控制如何将对象编码到XML

XmlSerializerNamespaces

包含XmlSerializer用于在XML文档实例中生成限定名的XML命名空间和前缀

XmlTypeMapping

包含从一种类型到另一种类型的映射

  更多更详细的说明,请看官方API:

3. XML封装类 

最后整理一个XML的封装类提供给小伙伴们,里面包含了XML节点到DataSet,DataTable及XML序列化和反序列化,XML写入文件或读取XML文件及节点等。

文件名:XmlHelper.cs

代码如下:

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Threading.Tasks;  6 using System.IO;  7 using System.Data;  8 using System.Xml;  9 using System.Xml.Serialization; 10 using System.Xml.Linq; 11  12 namespace Common 13 { 14     ///  15     /// Xml通用类 16     /// Author:YuBinfeng 17     /// Data:2015/07/10 18     ///  19     public class XmlHelper 20     { 21       22         #region XML的基础读写 23  24         #region 将XML文本写入到指定路径的文件 25         ///  26         /// 将XML文本写入到指定路径的文件 27         ///  28         ///  29         ///  30         /// 
31 public static bool WriteXmlString(string XMLString,string filePath) 32 { 33 try 34 { 35 File.WriteAllText(filePath, XMLString,Encoding.Default); 36 return true; 37 } 38 catch 39 { 40 return false; 41 } 42 } 43 #endregion 44 45 #region 从指定的路径读取XML文本 46 /// 47 /// 将XML文本写入到指定路径的文件 48 /// 49 /// 50 /// 51 ///
52 public static string ReadXmlString( string filePath) 53 { 54 try 55 { 56 XmlDocument xmlDoc = new XmlDocument(); 57 xmlDoc.Load(filePath); 58 return xmlDoc.InnerXml; 59 } 60 catch (Exception ex) 61 { 62 return ""; 63 } 64 } 65 #endregion 66 67 #region 读取XML资源中的指定节点内容 68 /// 69 /// 读取XML资源中的指定节点内容 70 /// 71 /// XML资源 72 /// XML资源类型:文件,字符串 73 /// 节点名称 74 ///
节点内容
75 public static object GetNodeValue(string source, XmlType xmlType, string nodeName) 76 { 77 XmlDocument xd = new XmlDocument(); 78 if (xmlType == XmlType.File) 79 { 80 xd.Load(source); 81 } 82 else 83 { 84 xd.LoadXml(source); 85 } 86 XmlElement xe = xd.DocumentElement; 87 XmlNode xn = xe.SelectSingleNode("//" + nodeName); 88 if (xn != null) 89 { 90 return xn.InnerText; 91 } 92 else 93 { 94 return null; 95 } 96 } 97 98 /// 99 /// 读取XML资源中的指定节点内容100 /// 101 /// XML资源102 /// 节点名称103 ///
节点内容
104 public static object GetNodeValue(string source, string nodeName)105 {106 if (source == null || nodeName == null || source == "" || nodeName == "" || source.Length < nodeName.Length * 2)107 {108 return null;109 }110 else111 {112 int start = source.IndexOf("<" + nodeName + ">") + nodeName.Length + 2;113 int end = source.IndexOf("
");114 if (start == -1 || end == -1)115 {116 return null;117 }118 else if (start >= end)119 {120 return null;121 }122 else123 {124 return source.Substring(start, end - start);125 }126 }127 }128 #endregion129 130 #region 更新XML文件中的指定节点内容131 /// 132 /// 更新XML文件中的指定节点内容133 /// 134 /// 文件路径135 /// 节点名称136 /// 更新内容137 ///
更新是否成功
138 public static bool UpdateNode(string filePath, string nodeName, string nodeValue)139 {140 bool flag = false;141 142 XmlDocument xd = new XmlDocument();143 xd.Load(filePath);144 XmlElement xe = xd.DocumentElement;145 XmlNode xn = xe.SelectSingleNode("//" + nodeName);146 if (xn != null)147 {148 xn.InnerText = nodeValue;149 flag = true;150 }151 else152 {153 flag = false;154 }155 return flag;156 }157 #endregion158 159 #region 操作xml文件中指定节点的数据160 /// 161 /// 获得xml文件中指定节点的节点数据162 /// 163 /// 164 ///
165 public static string GetNodeInfoByNodeName(string path, string nodeName)166 {167 string XmlString = "";168 XmlDocument xml = new XmlDocument();169 xml.Load(path);170 System.Xml.XmlElement root = xml.DocumentElement;171 System.Xml.XmlNode node = root.SelectSingleNode("//" + nodeName);172 if (node != null)173 {174 XmlString = node.InnerText;175 }176 return XmlString;177 }178 #endregion179 #endregion180 181 #region 共有属性182 /// 183 /// XML资源类型184 /// 185 public enum XmlType186 {187 File,188 String189 };190 #endregion191 192 #region XML与DataSet DataTable相关193 194 #region 读取XML资源到DataSet中195 /// 196 /// 读取XML资源到DataSet中197 /// 198 /// XML资源,文件为路径,否则为XML字符串199 /// XML资源类型200 ///
DataSet
201 public static DataSet GetDataSet(string source, XmlType xmlType)202 {203 DataSet ds = new DataSet();204 if (xmlType == XmlType.File)205 {206 ds.ReadXml(source);207 }208 else209 {210 XmlDocument xd = new XmlDocument();211 xd.LoadXml(source);212 XmlNodeReader xnr = new XmlNodeReader(xd);213 ds.ReadXml(xnr);214 }215 return ds;216 }217 218 #endregion219 220 #region 获取一个字符串xml文档中的ds221 /// 222 /// 获取一个字符串xml文档中的ds223 /// 224 /// 含有xml信息的字符串225 public static void get_XmlValue_ds(string xml_string, ref DataSet ds)226 {227 System.Xml.XmlDocument xd = new XmlDocument();228 xd.LoadXml(xml_string);229 XmlNodeReader xnr = new XmlNodeReader(xd);230 ds.ReadXml(xnr);231 xnr.Close();232 int a = ds.Tables.Count;233 }234 #endregion235 236 #region 读取XML资源到DataTable中237 /// 238 /// 读取XML资源到DataTable中239 /// 240 /// XML资源,文件为路径,否则为XML字符串241 /// XML资源类型:文件,字符串242 /// 表名称243 ///
DataTable
244 public static DataTable GetTable(string source, XmlType xmlType, string tableName)245 {246 DataSet ds = new DataSet();247 if (xmlType == XmlType.File)248 {249 ds.ReadXml(source);250 }251 else252 {253 XmlDocument xd = new XmlDocument();254 xd.LoadXml(source);255 XmlNodeReader xnr = new XmlNodeReader(xd);256 ds.ReadXml(xnr);257 }258 return ds.Tables[tableName];259 }260 #endregion261 262 #region 读取XML资源中指定的DataTable的指定行指定列的值263 /// 264 /// 读取XML资源中指定的DataTable的指定行指定列的值265 /// 266 /// XML资源267 /// XML资源类型:文件,字符串268 /// 表名269 /// 行号270 /// 列名271 ///
值,不存在时返回Null
272 public static object GetTableCell(string source, XmlType xmlType, string tableName, int rowIndex, string colName)273 {274 DataSet ds = new DataSet();275 if (xmlType == XmlType.File)276 {277 ds.ReadXml(source);278 }279 else280 {281 XmlDocument xd = new XmlDocument();282 xd.LoadXml(source);283 XmlNodeReader xnr = new XmlNodeReader(xd);284 ds.ReadXml(xnr);285 }286 return ds.Tables[tableName].Rows[rowIndex][colName];287 }288 #endregion289 290 #region 读取XML资源中指定的DataTable的指定行指定列的值291 /// 292 /// 读取XML资源中指定的DataTable的指定行指定列的值293 /// 294 /// XML资源295 /// XML资源类型:文件,字符串296 /// 表名297 /// 行号298 /// 列号299 ///
值,不存在时返回Null
300 public static object GetTableCell(string source, XmlType xmlType, string tableName, int rowIndex, int colIndex)301 {302 DataSet ds = new DataSet();303 if (xmlType == XmlType.File)304 {305 ds.ReadXml(source);306 }307 else308 {309 XmlDocument xd = new XmlDocument();310 xd.LoadXml(source);311 XmlNodeReader xnr = new XmlNodeReader(xd);312 ds.ReadXml(xnr);313 }314 return ds.Tables[tableName].Rows[rowIndex][colIndex];315 }316 #endregion317 318 #region 将DataTable写入XML文件中319 /// 320 /// 将DataTable写入XML文件中321 /// 322 /// 含有数据的DataTable323 /// 文件路径324 public static void SaveTableToFile(DataTable dt, string filePath)325 {326 DataSet ds = new DataSet("Config");327 ds.Tables.Add(dt.Copy());328 ds.WriteXml(filePath);329 }330 #endregion331 332 #region 将DataTable以指定的根结点名称写入文件333 /// 334 /// 将DataTable以指定的根结点名称写入文件335 /// 336 /// 含有数据的DataTable337 /// 根结点名称338 /// 文件路径339 public static void SaveTableToFile(DataTable dt, string rootName, string filePath)340 {341 DataSet ds = new DataSet(rootName);342 ds.Tables.Add(dt.Copy());343 ds.WriteXml(filePath);344 }345 #endregion346 347 #region 使用DataSet方式更新XML文件节点348 /// 349 /// 使用DataSet方式更新XML文件节点350 /// 351 /// XML文件路径352 /// 表名称353 /// 行号354 /// 列名355 /// 更新值356 ///
更新是否成功
357 public static bool UpdateTableCell(string filePath, string tableName, int rowIndex, string colName, string content)358 {359 bool flag = false;360 DataSet ds = new DataSet();361 ds.ReadXml(filePath);362 DataTable dt = ds.Tables[tableName];363 364 if (dt.Rows[rowIndex][colName] != null)365 {366 dt.Rows[rowIndex][colName] = content;367 ds.WriteXml(filePath);368 flag = true;369 }370 else371 {372 flag = false;373 }374 return flag;375 }376 #endregion377 378 #region 使用DataSet方式更新XML文件节点379 /// 380 /// 使用DataSet方式更新XML文件节点381 /// 382 /// XML文件路径383 /// 表名称384 /// 行号385 /// 列号386 /// 更新值387 ///
更新是否成功
388 public static bool UpdateTableCell(string filePath, string tableName, int rowIndex, int colIndex, string content)389 {390 bool flag = false;391 392 DataSet ds = new DataSet();393 ds.ReadXml(filePath);394 DataTable dt = ds.Tables[tableName];395 396 if (dt.Rows[rowIndex][colIndex] != null)397 {398 dt.Rows[rowIndex][colIndex] = content;399 ds.WriteXml(filePath);400 flag = true;401 }402 else403 {404 flag = false;405 }406 return flag;407 }408 #endregion409 410 #endregion411 412 #region XML序列化与反序列化相关413 414 /// 415 /// 序列化XML 对象=》XML文本416 /// 下面注释项,可根据需要使用417 /// 418 /// 419 ///
420 public static string ObjectToXmlSerializer(Object Obj)421 {422 string XmlString = "";423 XmlWriterSettings settings = new XmlWriterSettings();424 //settings.OmitXmlDeclaration = true;//去除xml声明425 settings.Encoding = Encoding.Default;//使用默认编码426 //settings.IndentChars = "--"; //使用指定字符缩进427 settings.Indent = true; //换行缩进428 429 using (System.IO.MemoryStream mem = new MemoryStream())430 {431 using (XmlWriter writer = XmlWriter.Create(mem, settings))432 {433 //去除默认命名空间xmlns:xsd和xmlns:xsi434 XmlSerializerNamespaces ns = new XmlSerializerNamespaces();435 ns.Add("", "");436 437 XmlSerializer formatter = new XmlSerializer(Obj.GetType());438 formatter.Serialize(writer, Obj, ns);439 }440 XmlString = Encoding.Default.GetString(mem.ToArray());441 }442 return XmlString;443 }444 445 /// 446 /// 反序列化 XML文本=》对象 447 /// 448 ///
449 /// 450 ///
451 public static T ObjectToXmlDESerializer
(string str) where T : class452 {453 object obj;454 using (System.IO.MemoryStream mem = new MemoryStream(Encoding.Default.GetBytes(str)))455 {456 using (XmlReader reader = XmlReader.Create(mem))457 {458 XmlSerializer formatter = new XmlSerializer(typeof(T));459 obj = formatter.Deserialize(reader);460 }461 }462 return obj as T;463 }464 465 #endregion466 467 }468 }
View Code

4. 本节要点:

A.本节主要介绍了通过序列化接口IXmlSerializable实现XML序列化

B.XML本身的操作简单介绍

C.最后提供了一个序列化及XML操作的通用类

==============================================================================================  

 

 <如果对你有帮助,记得点一下推荐哦,如有有不明白或错误之处,请多交流>  

<对本系列文章阅读有困难的朋友,请先看>

<转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>

.NET 技术交流群:467189533   

==============================================================================================   

你可能感兴趣的文章
基于ROS和beaglebone的串口通信方式,使用键盘控制移动机器人
查看>>
android.view.WindowLeaked的解决办法
查看>>
存储过程的笔记
查看>>
OpenCV学习(27) 直方图(4)
查看>>
深度学习原理与框架-Tensorflow基本操作-实现线性拟合
查看>>
[leetcode-168-Excel Sheet Column Title]
查看>>
SpringBoot和数据库连接
查看>>
二叉搜索树
查看>>
网页小技巧-360doc个人图书馆复制文字
查看>>
delete删除-some
查看>>
maven阿里云中央仓库
查看>>
15.12.14listbox列表框
查看>>
sql 行转列
查看>>
(转)Python新手写出漂亮的爬虫代码1——从html获取信息
查看>>
配置Nim的默认编译参数 release build并运行
查看>>
图片下载
查看>>
《构建之法》第四章读后感
查看>>
python os.path.dirname()
查看>>
android 解析json数据格式
查看>>
Vs2013 头文件注释
查看>>