使用 xmlserializer c# 反序列化时如何更改 xml 属性?

问题描述

使用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; }

我已经阅读了一些 MSDN 文档,但没有找到任何解决方案。

解决方法

没有使用单个属性实现此目的的优雅方法。我知道要实现预期结果的唯一方法是使用 [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 的转换,但在序列化期间管理错误时这样做可能会出现问题。