Serialize Property as Xml Attribute in Element Serialize Property as Xml Attribute in Element xml xml

Serialize Property as Xml Attribute in Element


You will need wrapper classes:

public class SomeIntInfo{    [XmlAttribute]    public int Value { get; set; }}public class SomeStringInfo{    [XmlAttribute]    public string Value { get; set; }}public class SomeModel{    [XmlElement("SomeStringElementName")]    public SomeStringInfo SomeString { get; set; }    [XmlElement("SomeInfoElementName")]    public SomeIntInfo SomeInfo { get; set; }}

or a more generic approach if you prefer:

public class SomeInfo<T>{    [XmlAttribute]    public T Value { get; set; }}public class SomeModel{    [XmlElement("SomeStringElementName")]    public SomeInfo<string> SomeString { get; set; }    [XmlElement("SomeInfoElementName")]    public SomeInfo<int> SomeInfo { get; set; }}

And then:

class Program{    static void Main()    {        var model = new SomeModel        {            SomeString = new SomeInfo<string> { Value = "testData" },            SomeInfo = new SomeInfo<int> { Value = 5 }        };        var serializer = new XmlSerializer(model.GetType());        serializer.Serialize(Console.Out, model);    }}

will produce:

<?xml version="1.0" encoding="ibm850"?><SomeModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <SomeStringElementName Value="testData" />  <SomeInfoElementName Value="5" /></SomeModel>


Kind of, use the XmlAttribute instead of XmlElement, but it won't look like what you want. It will look like the following:

<SomeModel SomeStringElementName="testData"> </SomeModel> 

The only way I can think of to achieve what you want (natively) would be to have properties pointing to objects named SomeStringElementName and SomeInfoElementName where the class contained a single getter named "value". You could take this one step further and use DataContractSerializer so that the wrapper classes can be private. XmlSerializer won't read private properties.

// TODO: make the class generic so that an int or string can be used.[Serializable]  public class SerializationClass{    public SerializationClass(string value)    {        this.Value = value;    }    [XmlAttribute("value")]    public string Value { get; }}[Serializable]                     public class SomeModel                     {                         [XmlIgnore]                         public string SomeString { get; set; }                         [XmlIgnore]                          public int SomeInfo { get; set; }      [XmlElement]    public SerializationClass SomeStringElementName    {        get { return new SerializationClass(this.SomeString); }    }               }