2011-07-19 20 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> 

意義沒有xmlns的東西,沒有標籤的值爲null。

請協助MEH

回答

4

將以下屬性添加到您的可空字段:

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

這讓XmlSerializer的(這是一個有點啞約Nulllable域)認識到,沒有結束時間已指定,並,因此,該字段不需要序列化。

這裏的documentation of this feature

另一種方法是使用一種特殊的模式創建由XmlSerializer的認可布爾字段,並以XmlIgnoreAttribute適用於該領域。該模式以propertyName指定的的形式創建。例如,如果有一個名爲「MyFirstName」的字段,則還會創建一個名爲「MyFirstNameSpecified」的字段,該字段指示XmlSerializer是否生成名爲「MyFirstName」的XML元素。

這裏有一個相關的SO問題,提供更多的細節和解釋:

有關刪除XML處理指令(即<?xml ... ?>部分),還有一個SO問題關於此:

+0

目前還不清楚我如何刪除<?xml version = \「1.0 \」?>而不經過地獄和請詳細說明\ – Nahum

+1

@Nahum:[This answer](http:// stackoverflow .com/questions/164585/omitting-xml-processing-instruction-when-serializing-an-object/322091#322091)有一個簡短的代碼示例。這有幫助嗎? – Heinzi

+0

感謝您的回答,它也幫助了我。 – LadislavM

相關問題