问题描述
使用XmlSerializer反序列化xml时有没有修改属性值的方法?
例如,我有这样的xml:
<chunkList>
<chunk id="ch1" type="p">
<sentence id="s1">
<tok>
<orth>XXX</orth>
<lex disamb="1">
<base>XXX</base>
<ctag>subst:sg:nom:f</ctag>
</lex>
</tok>
</sentence>
</chunk>
</chunkList>
我想将 chunk
元素反序列化为 Chunk
类并将属性 id="ch1"
设置为 Id
属性 - 有没有办法修剪这个 ch
子字符串和将数字 1
分配给 int 类型的属性?
[XmlAttribute("id")] //maybe there is some attribute to achive this?
public int Id { get; set; }
解决方法
没有使用单个属性实现此目的的优雅方法。我知道要实现预期结果的唯一方法是使用 [XmlIgnore] 并专门为字符串化的 xml ID 创建第二个属性,并为内部整数值创建一个本地化的转换器属性。一些类似的内容:
[XmlAttribute("id")]
public string _id_xml {get; set;}
[XmlIgnore]
public int Id {
// convert local copy of xml attribute value to/from int.
get => int.Parse(_id_xml.Replace("ch",""));
set => _id_xml = $"ch{value}";
}
我的转换器非常基础,显然您需要改进它并考虑错误处理。
序列化程序将照常对 [XmlAttribute] 进行操作,但会忽略 [XmlIgnore]。您的 c# 代码也可以使用。 不幸的是,XmlSerializer 需要公共属性,因此您无法从代码中隐藏 _id_xml 属性,但您可以使用 [Obsolete] 在编译器中发出警告信号。
您可以使用 _id_xml getter 和 setter 进行 int 与 int 的转换,但在序列化期间管理错误时这样做可能会出现问题。