【问题标题】:How to change xml attribute while deserialization with xmlserializer c#?如何在使用 xmlserializer c# 反序列化时更改 xml 属性?
【发布时间】:2021-06-24 01:18:20
【问题描述】:

使用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 文档,但没有找到任何解决方案。

【问题讨论】:

标签: c# xml xmlserializer


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2013-04-26
    • 2018-06-14
    相关资源
    最近更新 更多