【问题标题】:Deserializing empty XML tags in C# with enumerations使用枚举反序列化 C# 中的空 XML 标记
【发布时间】:2019-04-12 19:46:15
【问题描述】:

我尝试按照this post 中的说明实现反序列化,但没有成功:

(* 我正在使用 LinqPad 进行测试,这就是为什么您可以在我的示例末尾看到 .Dump() 调用)

在这段代码中,我收到“实例验证错误:'' is not a valid value for 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 属性并创建了另一个成员来将空标记的值作为字符串导入,并将其分配给 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】:

你可以使用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,
}

【讨论】:

  • 是的,如果 xml 带有一个空标签,这可以工作,谢谢。但如果它带有 ND,它就会失败。当值为空或 "ND" 时,我可以做些什么来分配 ND?
  • 感谢这项工作!它更简单,我喜欢它。您能解释一下“默认”属性的来源吗?我找不到任何涉及此属性的在线文档。很清楚它的含义,以及它是如何工作的,是的,但是它在哪里记录?如果您能告诉我们链接...而且我认为“= 2”是多余的,因为没有它代码也可以工作(ND 的实际值是 2,因为这是该成员出现在枚举)
  • @Roger = 2 确实是多余的,它是测试的剩余部分。 Default(带有大写字母 D)没有什么特别之处,只是像 HOMU 这样的名称。在一个枚举中,您可以使用多个具有相同值的名称。这里,Default 的值是ND,所以比较它们时它们是相同的。除非您.ToString() 或格式化它们,否则将打印名字。但是,谁是第一个由编译器决定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多