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?

1 Answer 1

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);
                }
Sign up to request clarification or add additional context in comments.

1 Comment

I tried that, but when I use XmlInclude I get unwanted type attributes for item object.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.