Intereting Posts
Генерировать динамический метод для установки поля структуры вместо использования отражения настраиваемый ConfigurationSection В C #, в чем разница между \ n и \ r \ n? Universal Apps MessageBox: «Имя« MessageBox »не существует в текущем контексте» Как определить, когда приложение теряет фокус? Использовать прокси-сервер с помощью элемента управления webBrowser C # /. Net 3.5 Являются ли методы расширения объектно-ориентированной функцией C #? C #: как получить все публичные (как get и set) строковые свойства типа поиск возможных комбинаций linq MVVM – что является идеальным способом для пользовательского контроля разговаривать друг с другом C # Доступ запрещен к пути в приложении Windows Преобразование TimeSpan из формата «hh: mm: ss» в «hh: mm» Использование System.Uri для удаления избыточной косой черты Генерировать токен в controllerе Преобразовать список (объекта) в список (строки)

Deserialize Xml с пустыми элементами

Рассмотрим следующий XML:

 2   

Мне нужно десериализовать этот xml для объекта. Итак, я написал следующий class.

 public class A { [XmlElement("b", Namespace = "")] public int? B { get; set; } [XmlElement("c", Namespace = "")] public int? C { get; set; } } 

Поскольку я использую nullables, я ожидал, что при десериализации вышеуказанного xml я бы получил объект A с нулевым свойством C.

Вместо этого я получаю исключение, сообщающее, что у документа есть ошибка.

Существует разница между отсутствующим элементом и нулевым элементом.

Отсутствует элемент 2 . Здесь C примет любое значение по умолчанию, указанное вами, с использованием атрибута DefaultValue или null, если нет явного значения по умолчанию.

Нулевой элемент 2 . Здесь вы получите null.

Когда вы выполните 2 сериализатор xml попытается проанализировать строку. Элемент как целое a будет корректно терпеть неудачу.

Поскольку ваш поставщик генерирует недопустимый xml, вам нужно будет это сделать, если вы используете XmlSerializer:

 [XmlRoot(ElementName = "a")] public class A { [XmlElement(ElementName = "b")] public int? B { get; set; } [XmlElement(ElementName = "c")] public string _c { get; set; } public int? C { get { int retval; return !string.IsNullOrWhiteSpace(_c) && int.TryParse(_c, out retval) ? (int?) retval : null; } } } 

или немного лучше, используя DataContractSerializer

 [DataContract(Name="a")] public class A1 { [DataMember(Name = "b")] public int? B { get; set; } [DataMember(Name = "c")] private string _c { get; set; } public int? C { get { int retval; return !string.IsNullOrWhiteSpace(_c) && int.TryParse(_c, out retval) ? (int?)retval : null; } } } 

хотя DataContractSerializer не поддерживает атрибуты, если это проблема.

Чтобы десериализовать пустые tags типа «c» в вашем примере:

   2   

Я использовал этот подход. Сначала он удаляет нулевые или пустые элементы из XML-файла с использованием LINQ, а затем десериализует новый документ без нулевых или пустых тегов в class Foo.

  public static Foo ReadXML(string file) { Foo foo = null; XDocument xdoc = XDocument.Load(file); xdoc.Descendants().Where(e => string.IsNullOrEmpty(e.Value)).Remove(); XmlSerializer xmlSer = new XmlSerializer(typeof(Foo)); using (var reader = xdoc.Root.CreateReader()) { foo = (Foo)xmlSer.Deserialize(reader); reader.Close(); } if (foo == null) foo = new Foo(); return foo; } 

Это даст вам значения по умолчанию для отсутствующих свойств.

  foo.b = 2; foo.c = 0; //for example, if it's an integer 

Я присоединился к информации по этим ссылкам :

Удалить пустые tags XML

Использовать XDocument в качестве источника для XmlSerializer.Deserialize?