【问题标题】:Read XML with C# with custom deserializer使用 C# 和自定义反序列化器读取 XML
【发布时间】:2013-05-11 17:43:19
【问题描述】:

我正在尝试反序列化某些 API 提供的一段 XML。然而这个 API 是愚蠢的,例如,一个 bool 不是 true,而是 True。并且有一个元素

[XmlElement("Foo")]
public bool Foo { get;set; }

然后是匹配的 XML:

<...><Foo>True</Foo></...>

不起作用,因为 True 不是 bool 的有效表示(API 是用 Python 编写的,我认为这更宽容)。

有没有什么办法可以在我的属性Foo上放一些属性对系统说:遇到这个元素,通过这个转换器类放?

编辑: XML 很大,而且大多数都是愚蠢的,不能直接转换的对象,比如234KB,我需要将其解析为确切的值。

我需要为它们中的每一个写一个包装器属性吗?

【问题讨论】:

  • 结构是否足够复杂以至于你真的需要使用内置的 XML 序列化?只能用手做吗? LINQ to XML 通常使这变得非常简单。
  • 在python中,true区分大小写,必须大写。
  • @Jon 好点,但我想知道是否有可能在不使用自定义类型(而不是 bool)的情况下实现我想要的方式。编写自定义转换器类没有问题。
  • 我认为 C# 可以将 'True' 解析为布尔值。你确定这是它不起作用的原因吗?

标签: c# .net xml deserialization


【解决方案1】:

您可以使用支持属性:

public class MyModel
{
    [XmlIgnore]
    public bool Foo 
    {
        get
        {
            return string.Equals(FooXml, "true", StringComparison.OrdinalIgnoreCase);
        }
        set
        {
            FooXml = value.ToString();
        }
    }

    [XmlElement("Foo")]
    public string FooXml { get; set; }
}

【讨论】:

  • 是的,这是可能的,但我尽量少做管道。
猜你喜欢
  • 2020-05-27
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2011-06-28
  • 1970-01-01
相关资源
最近更新 更多