Десериализуйте Xml с пустыми элементами в C#

Попытка десериализовать некоторые xml отрывки от поставщика в объекты. Проблема состоит в том, что я получаю недопустимый формат на каждом empy теге элементов. Я могу десериализовать объект без проблем, когда все элементы имеют значения. Или пустые элементы опущены.

Xml Snippit:

<нечто>
<внесите предложение> 1 </, вносят предложение>
<propTwo/>
</нечто>

Класс C#:

[Serialilbe()]     
public class foo
{ 
   public foo(){}
   [XmlElementAttribute(IsNullable = true)]
   public int? propOne {get;set;} 
   [XmlElementAttribute(IsNullable = true)]
   public int? propTwo {get;set;}   
 }

Существует ли установка на классе, который я могу сделать для корректировки парсинга?
или
Существует ли простой способ, которым я могу применить xsl для удаления этих элементов?
или
Я должен использовать regEx для удаления пустых элементов быть носом desrializing?
или
еще лучший путь?

20
задан Zé Carlos 12 March 2012 в 20:00
поделиться

3 ответа

Наиболее единообразным способом очистки этих узлов, по-видимому, является добавление фильтра RegEx к десериализатору.

  public static T Deserialize  (строка xml) {
XmlSerializer xs = новый XmlSerializer (typeof (T));
строка cleanXml = Regex.Replace (xml, @ "<[a-zA-Z]. [^ (> <.)] + />",
новый MatchEvaluator (RemoveText));
MemoryStream memoryStream = новый MemoryStream ((новый UTF8Encoding ()). GetBytes (cleanXml));
XmlTextWriter xmlTextWriter = новый XmlTextWriter (memoryStream, Encoding.UTF8);
return (T) xs.Deserialize (memoryStream);
 }
  static string RemoveText(Match m) { return "";}
13
ответ дан 30 November 2019 в 00:27
поделиться

См. Эту статью: Может ли XmlSerializer десериализоваться в Nullable?

Вкратце, если вы хотите использовать типы, допускающие значение NULL, ваш XML должен выглядеть следующим образом:

<foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<propOne>1</propOne>
<propTwo xsi:nil='true'/>
</foo>

Два изменения добавляют пространство имен и явно устанавливают для xsi: nil значение true для нулевого элемента.

Если у вас нет контроля над своим Xml, здесь описан более продвинутый метод: Использование XmlSerializer для десериализации в Nullable

9
ответ дан 30 November 2019 в 00:27
поделиться

Для простоты, почему бы вам не проанализировать xml явно с помощью XmlDocument и XPath? Используйте XPath для явного доступа к каждому узлу xml, например.

XmlNode node = xml.SelectSingleNode ("foo/PropOne");
if (node != null)
{
     propOneValue = node.innerText;
}
0
ответ дан 30 November 2019 в 00:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: