0

I'm trying to build serialization for my application that must export data in specific format, below is sample what is expected:

<?xml version="1.0" encoding="utf-8"?>
<sync>
  <table name="Test" diff="0" mode="db">
    <keys>
      <key>MY_NUMBER</key>
      <key>ID</key>
    </keys>
    <items task="modify">
      <item ID="OK" MY_NUMBER="two"/>
      <item ID="NT" MY_NUMBER="two"/>
    </items>
  </table>
  <table name="Second" diff="1" mode="x">
    <keys>
      <key>ID</key>
    </keys>
    <items task="add">
      <item ID="x" TYPE="c"/>
    </items>
  </table>
</sync>

I was able to get similar results:

<?xml version="1.0" encoding="utf-8"?>
<sync>
  <table name="Test" diff="0" mode="db" task="modify">
    <keys>
      <key>MY_NUMBER</key>
      <key>ID</key>
    </keys>
    <items>
      <item d4p1:type="FirstItem" ID="OK" MY_NUMBER="two" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
      <item d4p1:type="FirstItem" ID="NT" MY_NUMBER="two" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
    </items>
  </table>
  <table name="SecondTest" diff="1" mode="x" task="add">
    <keys>
      <key>ID</key>
    </keys>
    <items>
      <item d4p1:type="SecondItem" ID="x" TYPE="c" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
    </items>
  </table>
</sync>

But I get unwanted namespaces, I've tried searching SO for solutions (Omitting all xsi and xsd namespaces when serializing an object in .NET?, Remove Namespaces During XML Serialization) but without luck.

I have my classes defined like this:

namespace Sync.Models
{
    [XmlRoot("sync")]
    [XmlInclude(typeof(FirstItem))]
    [XmlInclude(typeof(SecondItem))]
    public class Export
    {
        [XmlElement(ElementName = "table")]
        public Table users { get; set; }

        [XmlElement(ElementName = "table2")]
        public Table items { get; set; }
    }

    public class Table
    {
        [XmlAttribute("name")]
        public string name { get; set; }
        [XmlAttribute("diff")]
        public int diff { get; set; }
        [XmlAttribute("mode")]
        public string mode { get; set; }

        [XmlArray("keys")]
        [XmlArrayItem("key")]
        public List<string> Keys { get; set; }

        [XmlArray("items")]
        [XmlArrayItem("item")]
        public List<BaseItem> Items { get; set; }

        [XmlAttribute("task")]
        public string Task { get; set; }
    }

    public class FirstItem:BaseItem
    {
        [XmlAttribute("MY_NUMBER")]
        public string Number { get; set; }
    }
    public class SecondItem:BaseItem
    {
        [XmlAttribute("TYPE")]
        public string Type { get; set; }
    }
}

And finally my serialization functionality:

var testData = new Export
{
    users = new Table
    {
        name = "Test",
        diff = 0,
        mode = "db",
        Keys = new List<string> { "MY_NUMBER", "ID" },
        Items = new List<BaseItem>
        {

            new FirstItem {Id = "OK", Number = "two"},
            new FirstItem {Id = "NT", Number = "two"}
        },
        Task = "modify"
    },
    items = new Table
    {
        name = "SecondTest",
        diff = 1,
        mode = "x",
        Keys = new List<string> { "ID" },
        Items = new List<BaseItem>
        {
            new SecondItem{Id = "x",Type = "c"}
        },
        Task = "add"
    }
};


var fileName_tmp = String.Format(@"{0}\xml1.xml", Application.StartupPath);
var fileName = String.Format(@"{0}\xml.xml", Application.StartupPath);

var serializer = new XmlSerializer(typeof(Export));
using (TextWriter writer = new StreamWriter(fileName_tmp))
{
    serializer.Serialize(writer, testData, new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty}));
}

using (FileStream inputStream = File.OpenRead(fileName_tmp))
{
    using (StreamReader inputReader = new StreamReader(inputStream))
    {
        using (StreamWriter outputWriter = File.CreateText(fileName))
        {
            string tempLineValue;
            while (null != (tempLineValue = inputReader.ReadLine()))
            {
                outputWriter.WriteLine(tempLineValue.Replace("table2", "table"));
            }
        }
    }
}

1. I would like to remove unwanted namespaces and type attribute from nodes, but as I wrote before solution I found isn't working.
2. I need to have multiple nodes with same name (table), for now my only solution is to replace tag after serialization. I know I could use List to store tables, but during serialization this is giving me one extra unwanted level-can this be removed? Or custom serialization is only option?
3. Right now Task property from table is stored as attribute of table node in xml. Can I move it to items, to get desired result? Or do I must create custom serialization?

Community
  • 1
  • 1
Misiu
  • 4,738
  • 21
  • 94
  • 198

1 Answers1

0

you can remove namesapces by add this code

using (FileStream stream = new FileStream("FilePath",FileMode.Create))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(YourClass));
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("", "");                    
                    serializer.Serialize(stream," Your Object to Serialize",ns);
                }
j.kahil
  • 276
  • 5
  • 16
  • I tried that, but when I use `XmlInclude` I get unwanted type attributes for item object. – Misiu Feb 15 '15 at 19:26