Десериализация пустых тегов XML в C # с перечислениями - PullRequest
0 голосов
/ 12 апреля 2019

Я пытался добиться десериализации, как объяснено в этом посте , но безуспешно:

(* Я использую 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
}

Мне бы хотелось, чтобы члену Sexo в Product присваивалось значение 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
}

Спасибо всем!

Роджер

1 Ответ

0 голосов
/ 13 апреля 2019

Вы можете использовать атрибут 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,
}
...