I want to use default xml serializer to serialize data as follows:
<?xml version="1.0" encoding="gb2312"?>
<Entry EntryName="testentry1">
<Properties>
<Property Key="Property1">Value1</Property>
<Property Key="Property2">Value2</Property>
</Properties>
</Entry>
Rather than:
<?xml version="1.0" encoding="gb2312"?>
<Entry EntryName="testentry1">
<Properties>
<Property Key="Property1">
<Value>Value1</Value>
</Property>
<Property Key="Property2">
<Value>Value2</Value>
</Property>
</Properties>
</Entry>
i.e. Value1 and Value2 as text rather than xml elements. Attribute XmlText can do the job!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace XmlSerialization
{
[Serializable]
public class Entry
{
[XmlAttribute("EntryName")]
public String Name { get; set; }
[XmlArray("Properties")]
[XmlArrayItem(Type = typeof(Property))]
public Property[] Properties { get; set; }
}
[Serializable]
public class Property
{
[XmlAttribute]
public String Key { get; set; }
[XmlText]
public String Value { get; set; }
}
}
A test program is as follows:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace XmlSerialization
{
class Program
{
public static void Main(String[] args)
{
var entry1 = new Entry { Name = "testentry1", Properties = new Property[2] };
entry1.Properties[0] = new Property()
{
Key = "Property1",
Value = "Value1"
};
entry1.Properties[1] = new Property()
{
Key = "Property2",
Value = "Value2"
};
var serializer = new XmlSerializer(typeof(Entry));
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
serializer.Serialize(Console.Out, entry1, ns);
Console.ReadKey();
}
}
}
Also the following code removes the default name space:
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
serializer.Serialize(Console.Out, entry1, ns);