使用XmlSerializer序列化XML多行文本时的换行符处理问题
解决XmlSerializer读取换行符适配MFC CEdit的问题
我有一个带string属性的C#类:
public string Location { get => _Location; set => _Location = value; } private string _Location;
使用XmlSerializer读写XML文件时,读取后Location变量里的换行符是\n,但MFC的CEdit控件需要\r\n才能正常显示多行文本。保存后的XML内容如下:
<Location>Line 1 Line 2 Line 3</Location>
想知道能不能通过XmlSerializer直接处理这个换行符转换,还是只能手动替换?
方案1:通过XmlSerializer特性自动处理
可以利用XmlTextAttribute的DataType属性指定为"text",让XmlSerializer自动完成换行符的平台适配转换。
修改属性定义如下:
[XmlText(DataType = "text")] public string Location { get => _Location; set => _Location = value; } private string _Location;
工作原理:当指定DataType="text"时,XmlSerializer会遵循XML文本节点的处理规则——读取XML时,将文件中的\n转换为当前系统的标准换行符(Windows下即为\r\n);序列化写入XML时,会把系统换行符转为XML通用的\n,同时保证CEdit控件能正常识别多行文本。
方案2:手动替换(当前使用的方式)
如果不想修改序列化特性,也可以在读取完成后、显示到CEdit前手动替换换行符:
// 读取XML后直接处理文本 var displayText = location.Replace("\n", "\r\n"); // 或者在属性的setter中统一处理 public string Location { get => _Location; set => _Location = value.Replace("\n", "\r\n"); }
这种方式需要自行维护转换逻辑,相比利用XmlSerializer特性的方案,灵活性稍差。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

