C# xml文档反序列化记事

简介: 本文介绍了使用XmlSerializer进行XML序列化和反序列化的关键点。包括:1) 以独占方式读取XML文件以避免并发问题;2) 当元素名与类型名不一致时,可通过`[XmlArrayItem]`指定元素名,或创建继承自原始类型的子类;3) 处理DateTime反序列化错误,通过中间字符串属性转换;4) 提到了常用C#特性如`[XmlRoot]`, `[XmlElement]`, `[XmlAttribute]`, `[XmlIgnore]`和`[XmlArrayItem]`的作用。

可以使用XmlSerializer直接序列化和反序列化xml

注意其中几个关键点

1. 读取xml文件时,以独占方式,这样可以避免文件被别的程序打开时读取报错的问题。

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {}

2. 在序列化反序列化时,当类型DeviceInfoDto对应的xml中元素的名字不是DeviceInfoDto而是device时,有两种解决方法:

方法一:

用该特性[XmlArrayItem("device")]指定类型DeviceInfoDto对应的在xml中的元素的名字device。

[XmlArrayItem("device")]
        public List<DeviceInfoDto> devices { get; set; } = new();

方法二:

需要变通:改以下代码中List<DeviceInfoDto>List<device>其中device为一个继承自DeviceInfoDto类型的子类

public List<device> devices { get; set; } = new();

public class device:DeviceInfoDto
{
}

3. 反序列化时对应C#类型DateTime时的报错处理

当直接使用一个类型为Datetime属性名为creationDate来在反序列化xml文件中的日期时间类型的接收者时,反序列化会报错:【字符串“2020-07-31 09:29:16”不是有效的AllXsd值】。于是采入引入一个中间属性stringCreationDate(类型为string)和存储其值的字段_creationDate(类型为DateTime)的方式,运行过程1.当反序列化时从xml文件读取元素名为creationDate的元素值并通过stringCreationDate的set访问器将其值在转值为DateTime类型后存放于字段_creationDate中 2.当C#代码中其他地方要访问这个值时,就从creationDate属性的get访问器传递出_creationDate字段的值。缺点:需引入不必要的属性和字段,而且属性名还必须是public的,这会让外部访问者对这个中间属性感到疑惑。

private DateTime _creationDate;
        [XmlElement(ElementName = "creationDate")]
        public string stringCreationDate { get => _creationDate.ToString("yyyy-MM-dd HH:mm:ss"); set => _creationDate = Convert.ToDateTime(value); }
        [XmlIgnore]
        public DateTime creationDate { get => _creationDate; }

4. 序列化反序列化时,XmlSerializer可识别的常用的C#特性标签 Attribute

a. [XmlRoot("udid")]

用于C#类名上,用于指明根类型对应的xml中的元素名

b. [XmlElement("creationDate")]

用于C#属性或字段上,用于指明属性对应的xml元素名或者叫标签名为 creationDate

c. [XmlAttribute("frequency")]

用于C#属性或字段上,用于指明属性或字段对应的XML元素的属性名为 frequency

d. [XmlIgnore]

用于C#属性或字段上,用来标记该字段在序列化反序列化XML文档时是要忽略的C#属性或字段

e. [XmlArrayItem("device")]

用于C# List<T>集合类型的属性或字段上,用来标记集合中的元素类型T在XML文档中对应的元素名称

相关文章
|
2月前
|
XML 存储 JavaScript
DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧
**XML DOM 遍历、操作和导航概述** - 遍历XML节点树用于提取信息,例如,通过JavaScript的DOM API循环`&lt;book&gt;`子节点显示名称和值。 - DOM解析器处理XML文本数据,包括解析字符数据(PCDATA)和识别CDATA段。 - 节点导航涉及`parentNode`、`childNodes`等属性,`get_nextSibling`等辅助函数避免空文本节点。 - `getElementsByTagName`、`getAttribute`和`nodeValue`用于检索元素、属性值和文本。
62 6
DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧
|
2月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
|
2月前
|
XML C# 数据格式
使用C#操作XML文件
使用C#操作XML文件
|
2月前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
74 1
|
2月前
|
XML JavaScript 数据格式
XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南
XML Schema(XSD)是用于定义XML文档结构的规范,它描述了元素、属性及其顺序、数据类型和约束。与DTD相比,XML Schema支持更多数据类型,如字符串、日期等,并且是基于XML的,允许扩展和重用。学习XML Schema有助于确保数据通信时双方对内容的理解一致,通过验证防止错误。示例展示了如何定义一个`note`元素,包含`to`, `from`, `heading`和`body`子元素,都是字符串类型。XML文档可以通过引用XML Schema进行验证,确保内容符合预设模式。
155 0
|
2月前
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
50 0
|
2月前
|
XML JavaScript 前端开发
XML文档节点导航与选择指南
XPath是XSLT的核心部分,用于XML文档的节点定位和选择。它采用路径表达式语法,包含200多个内置函数处理各种数据类型。XPath在编程语言如JavaScript中广泛使用,与XSLT配合进行XML转换和样式处理。它涉及7种节点类型,如元素、属性和文本,以及多种节点间关系,如父、子、同级等。XPath还使用轴(如ancestor、child)来描述节点间的关联,并支持运算符进行逻辑和数学操作。
42 0
XML文档节点导航与选择指南
|
2月前
|
XML 存储 数据格式
探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
DTD(文档类型定义)用于定义XML文档的结构和合法元素、属性。它允许不同团体就数据交换标准达成一致,并用于验证XML数据的有效性。DTD可通过内部声明(在XML文档内)或外部声明(在单独文件中)来定义。内部声明示例显示了如何定义`note`元素及其子元素的结构,而外部声明则引用外部DTD文件。元素、属性、实体和PCDATA/CDATA是XML构建模块。DTD中,元素通过ELEMENT声明定义,属性通过ATTLIST声明定义,实体声明提供特殊字符或外部资源的快捷方式。
57 0
|
2月前
|
存储 C#
C#中的序列化和反序列化案例
C#中的序列化和反序列化案例
|
2月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。