开发者

C# serialize simple object to xml. no namespace no Nulls

开发者 https://www.devze.com 2023-03-21 02:16 出处:网络
I got the following code: public class Alarm:IDisposable { MemoryStream _tmp; readonly XmlDocument _doc; private readonly XmlSerializerNamespaces _ns;

I got the following code:

public class Alarm:IDisposable
{
    MemoryStream _tmp;
    readonly XmlDocument _doc;
    private readonly XmlSerializerNamespaces _ns;
    private readonly 开发者_如何学PythonXmlSerializer _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;
        }

    }
}

I get as output"

 <?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>

I wanna get:

<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>

meaning no xmlns stuff, no tag where value is null.

please assist meh


Add the following properties to your Nullable fields:

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

This lets XmlSerializer (which is a bit dumb about Nulllable fields) realize that no EndTime has been specified, and, thus, the field does not need to be serialized.

Here's the documentation of this feature:

Another option is to use a special pattern to create a Boolean field recognized by the XmlSerializer, and to apply the XmlIgnoreAttribute to the field. The pattern is created in the form of propertyNameSpecified. For example, if there is a field named "MyFirstName" you would also create a field named "MyFirstNameSpecified" that instructs the XmlSerializer whether to generate the XML element named "MyFirstName".

Here's a related SO question that offers more details and explanations:

  • How to make a value type nullable with .NET XmlSerializer?

About removing the XML processing instruction (i.e., the <?xml ... ?> part), there's also a SO question about that:

  • Omitting XML processing instruction when serializing an object
0

精彩评论

暂无评论...
验证码 换一张
取 消