首页 > 解决方案 > 如何在 xml 反序列化期间忽略无效的枚举值?

问题描述

我想将 xml 文档反序列化为一个类,该类由相关的 xsd 文件生成。我无法控制 xml 文件的内容。

在反序列化过程中,我遇到了一个异常,因为 xml 文档中的枚举值不符合 xsd 的要求。我希望反序列化继续进行,而不是中断,并为任何此类错误采用默认值。有没有办法完成这种行为?


编辑:为了澄清,我想要实现的目标:我想从数字发票中读取数据。因此,xml 文件的创建是某种黑盒,并且可能包含 flash 值,即使结构符合标准。但这并不意味着,每一个价值都以这种方式存在缺陷。该异常使我无法读取正确的值,因此我只想通过在发生此类错误时以某种方式插入默认值来完成反序列化。

将值标记为过时或使用 XmlIgnore 标记它们都不起作用,因为我收到的下一个 xml 可能包含正确的值。

我希望这有助于澄清问题。


现在,我正在使用System.Xml.Serializationdll,但我愿意实现任何可以帮助我实现想要的行为的库。

我得到的例外是:

“System.InvalidOperationException:实例验证错误:'x' 不是 xType 的有效值。”

引发异常的代码:

XmlSerializer serializer = new xml.XmlSerializer(typeof(MyType));
MyType invoice = serializer.Deserialize(memoryStream) as MyType;

我知道代码没有多大帮助,所以我将添加枚举,这是目前有问题的:

public enum PaymentMeansCodeContentType
    {

        [System.Xml.Serialization.XmlEnumAttribute("10")]
        Item10,

        [System.Xml.Serialization.XmlEnumAttribute("20")]
        Item20,

        [System.Xml.Serialization.XmlEnumAttribute("30")]
        Item30,

        [System.Xml.Serialization.XmlEnumAttribute("48")]
        Item48,

        [System.Xml.Serialization.XmlEnumAttribute("49")]
        Item49,

        [System.Xml.Serialization.XmlEnumAttribute("57")]
        Item57,

        [System.Xml.Serialization.XmlEnumAttribute("58")]
        Item58,

        [System.Xml.Serialization.XmlEnumAttribute("59")]
        Item59,

        ZZZ,
    }

这些是使用 xsd 命令行工具自动生成的: https ://docs.microsoft.com/de-de/dotnet/standard/serialization/xml-schema-definition-tool-xsd-exe

我需要反序列化的 xml 为我提供了一个“1”,因此显然是一个无效值。我仍然需要从 xml 访问其他有效值并提供指示哪些值有缺陷的方法。

标签: c#.netenumsxml-deserialization

解决方案


您可以将成员标记为已过时

public enum TypeEnum
{
    Temperature,
    Pressure,
    [Obsolete]
    Humidity
}

更多信息 -文档


推荐阅读