如何修改C# XmlSerializer的CultureInfo设置以适配逗号分隔数值?
解决XML中逗号分隔的Double值反序列化问题
不用修改实体类的话,有两个可行方案:
方案一:自定义XmlTextReader处理数值格式
继承XmlTextReader,重写读取double的方法,把逗号替换成小数点后再解析,精准针对数值元素,不会误改其他内容:
public class CommaDecimalXmlReader : XmlTextReader { public CommaDecimalXmlReader(TextReader reader) : base(reader) { } public override double ReadElementContentAsDouble() { string content = ReadElementContentAsString(); // 替换逗号为小数点,用固定文化解析 return double.Parse(content.Replace(',', '.'), CultureInfo.InvariantCulture); } // 如果需要处理float等其他数值类型,可重写对应的ReadElementContentAsXXX方法 }
使用时直接传给XmlSerializer:
var serializer = new XmlSerializer(typeof(YourTargetClass)); using (var stringReader = new StringReader(rawXmlContent)) using (var xmlReader = new CommaDecimalXmlReader(stringReader)) { var deserializedObj = (YourTargetClass)serializer.Deserialize(xmlReader); }
方案二:全局替换XML中的逗号(谨慎使用)
如果能确保XML里所有逗号都是数值分隔符,不会出现在字符串、属性值等非数值场景中,可以先批量替换逗号为小数点再反序列化:
string processedXml = rawXmlContent.Replace(',', '.'); var serializer = new XmlSerializer(typeof(YourTargetClass)); using (var reader = new StringReader(processedXml)) { var deserializedObj = (YourTargetClass)serializer.Deserialize(reader); }
注意:此方法风险较高,若XML存在带逗号的字符串内容(如<Description>Weight: 5,0 kg</Description>),会被误修改导致数据错误,仅适用于结构简单的XML场景。
补充说明:XmlSerializer内部硬编码使用了InvariantCulture处理数值,所以修改CurrentCulture不会生效,必须通过自定义读取逻辑绕开这个限制。
内容的提问来源于stack exchange,提问作者BladeZ
相关产品推荐
相关产品推荐

