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

时间:2019-04-12 19:46:15

标签: c# xml deserialization xmlserializer xml-deserialization

我尝试实现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
}

谢谢大家!

罗杰

1 个答案:

答案 0 :(得分: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,
}