2011-07-19 2 views
1

Я получил следующий код:C# сериализуйте простой объект в xml. нет имен нет Нулевые

public class Alarm:IDisposable 
{ 
    MemoryStream _tmp; 
    readonly XmlDocument _doc; 
    private readonly XmlSerializerNamespaces _ns; 
    private readonly XmlSerializer _x = new XmlSerializer(typeof(Alarm)); 
    public int? ID { get; set; } 
    public string SourceSystem { get; set; } 
    public string SensorName { get; set; } 
    public string ModelName { get; set; } 
    public int? Severity { get; set; } 
    public int? Duration { get; set; } 
    public bool? Status { get; set; } 
    public DateTime? StartTime { get; set; } 
    public DateTime? EndTime { get; set; } 

    public Alarm() 
    { 
     _tmp = new MemoryStream(); 
     _doc = new XmlDocument(); 
     _ns = new XmlSerializerNamespaces(); 
     _ns.Add("", ""); 
    } 
    public string OuterXml() 
    { 

     //Add an empty namespace and empty value 
     _x.Serialize(_tmp, this, _ns); 
     _tmp.Position = 0; 
     _doc.Load(_tmp); 
     return _doc.OuterXml; 
    } 


    public void Dispose() 
    { 
     if (_tmp!=null) 
     { 
      _tmp.Close(); 
      _tmp = null; 
     } 

    } 
} 

я получаю в качестве выхода "

<?xml version=\"1.0\"?> 
<Alarm><ID>1</ID><SourceSystem>HMer</SourceSystem> 
<SensorName>4</SensorName><Severity d2p1:nil=\"true\" xmlns:d2p1=\"http://www.w3.org/2001/XMLSchema-instance\" /> 
<Duration>500</Duration><Status>true</Status> 
<StartTime>2011-07-19T12:29:51.171875+03:00</StartTime> 
<EndTime d2p1:nil=\"true\" 
xmlns:d2p1=\"http://www.w3.org/2001/XMLSchema-instance\" /></Alarm> 

Я хочу получить:

<Alarm><ID>1</ID><SourceSystem>HMer</SourceSystem><SensorName>4</SensorName> 
<Duration>500</Duration><Status>true</Status> 
<StartTime>2011-07-19T12:29:51.171875+03:00</StartTime></Alarm> 

значениеno xmlns stuff, no tag, где значение равно null.

пожалуйста помощь Мех

ответ

4

Добавьте следующие свойства к Nullable полей:

[XmlIgnore] 
public bool EndTimeSpecified { get { return EndTime.HasValue; } } 

Это позволяет XmlSerializer (который немного немой о Nulllable полей) понимают, что ни EndTime не было указано, и , таким образом, поле не нужно сериализовать.

Вот documentation of this feature:

Другого вариант заключается в использовании специального шаблона для создания логического поля, признанного XmlSerializer и применить XmlIgnoreAttribute к полю. Шаблон создается в виде propertyNameSpecified. Например, если есть поле с именем «MyFirstName», вы также создадите поле с именем «MyFirstNameSpecified», которое инструктирует XmlSerializer о том, следует ли генерировать XML-элемент с именем «MyFirstName».

Вот родственный SO вопрос, который предлагает более подробную информацию и объяснения:

об удалении инструкции обработки XML (т.е. <?xml ... ?> часть), есть также SO вопрос об этом:

+0

Непонятно, как удалить Без прохождения через ад и обратно, пожалуйста, уточните \ – Nahum

+1

@Nahum: [Этот ответ] (http: // stackoverflow .com/questions/164585/omitting-xml-processing-инструкция-когда-serializing-an-object/322091 # 322091) имеет пример с коротким кодом. Это помогает? – Heinzi

+0

Спасибо за ответ, это тоже помогло мне. – LadislavM

Смежные вопросы