使用枚举在C#中反序列化空XML标记

问题描述 投票:0回答:1

我试图实现this post中解释的反序列化,但没有成功:

(*我正在使用LinqPad来测试这个,这就是为什么你可以在我的样本结束时看到.Dump()调用)

在这段代码中,我得到“实例验证错误:''不是claves_sexo的有效值”,因为它是空的:

void Main()
{
  string xmlString = "<Products><Product><Id>1</Id><Name>My XML product</Name><Sexo></Sexo></Product></Products>";

  XmlSerializer serializer = new XmlSerializer(typeof(List<Product>), new XmlRootAttribute("Products"));

  StringReader stringReader = new StringReader(xmlString);

  List<Product> productList = (List<Product>)serializer.Deserialize(stringReader);

  productList.Dump();

}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public claves_sexo Sexo {get;set;}
}

public enum claves_sexo
{
    HO,
    MU,
    ND
}

我希望Product的Sexo成员在未通知的情况下为枚举分配值ND = 2。

我一直在玩XmlIgnore属性并创建了另一个成员来将空标记的值作为String导入,并将其分配给Sexo成员,但我没有成功。

  • 我被要求将Sexo成员的类型更改为String,但我无法更改claves_sexo类型,因为它属于我们使用的某些已确定的标准。

最后注意:这是最终有效的版本:

void Main()
{
    string xmlString = "<Products><Product><Id>1</Id><Name>My XML product</Name><Sexo>ND</Sexo></Product></Products>";  
    XmlSerializer serializer = new XmlSerializer(typeof(List<Product>), new XmlRootAttribute("Products"));
    StringReader stringReader = new StringReader(xmlString);
    List<Product> productList = (List<Product>)serializer.Deserialize(stringReader);
    productList.Dump();
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    [XmlIgnore]
    public claves_sexo Sexo {get;set;}

    [XmlElement("Sexo")]
    public string SexoAsString
    {
        get
        {
            return Sexo.ToString();
        }
        set
        {
            if (string.IsNullOrWhiteSpace(value))
            {
                Sexo = claves_sexo.ND;
            }
            else
            {
                Sexo = (claves_sexo)Enum.Parse(typeof(claves_sexo), value);
            }
        }
    }
}

public enum claves_sexo
{
    HO,
    MU,
    ND
}

谢谢大家 !

罗杰

c# xml deserialization xmlserializer xml-deserialization
1个回答
0
投票

您可以使用XmlEnum属性:

public enum claves_sexo
{
    [XmlEnum("HO")]HO,
    [XmlEnum("MU")]MU,
    [XmlEnum("")]ND
}

编辑:您可以使用具有相同值的多个名称来处理“”和“ND”:

public enum claves_sexo
{
    [XmlEnum("HO")]HO,
    [XmlEnum("MU")]MU,
    [XmlEnum("ND")]ND,
    [XmlEnum("")]Default = ND,
}
© www.soinside.com 2019 - 2024. All rights reserved.