Попытка десериализовать некоторые 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?
или
еще лучший путь?
Наиболее единообразным способом очистки этих узлов, по-видимому, является добавление фильтра 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 "";}
См. Эту статью: Может ли 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
Для простоты, почему бы вам не проанализировать xml явно с помощью XmlDocument и XPath? Используйте XPath для явного доступа к каждому узлу xml, например.
XmlNode node = xml.SelectSingleNode ("foo/PropOne");
if (node != null)
{
propOneValue = node.innerText;
}