XML Serialization - Disable rendering root element of array

60,735

Solution 1

To disable rendering of root element of collection, you must replace the attribute [XmlArrayItem] with [XmlElement] in your code.

For removing the xsi and xsd namespaces, create an XmlSerializerNamespaces instance with an empty namespace and pass it when you need to serialize your object.

Take a look on this example:

[XmlRoot("SHOPITEM")]
public class ShopItem
{
    [XmlElement("PRODUCTNAME")]
    public string ProductName { get; set; }

    [XmlElement("VARIANT")] // was [XmlArrayItem]
    public List<ShopItem> Variants { get; set; }
}

// ...

ShopItem item = new ShopItem()
{
    ProductName = "test",
    Variants    = new List<ShopItem>()
    {
        new ShopItem{ ProductName = "hi 1" },
        new ShopItem{ ProductName = "hi 2" }
    }
};

// This will remove the xsi/xsd namespaces from serialization
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");

XmlSerializer ser = new XmlSerializer(typeof(ShopItem));
ser.Serialize(Console.Out, item, ns);  // Inform the XmlSerializerNamespaces here

I got this output:

<?xml version="1.0" encoding="ibm850"?>
<SHOPITEM>
  <PRODUCTNAME>test</PRODUCTNAME>
  <VARIANT>
    <PRODUCTNAME>hi 1</PRODUCTNAME>
  </VARIANT>
  <VARIANT>
    <PRODUCTNAME>hi 2</PRODUCTNAME>
  </VARIANT>
</SHOPITEM>

Solution 2

Replace [XmlArrayItem("VARIANT")] with [XmlElement("VARIANT")].

Share:
60,735
Jan Remunda
Author by

Jan Remunda

I am interesting in designing and programing ASP.NET and windows applications in C#/VB.NET.

Updated on November 13, 2020

Comments

  • Jan Remunda
    Jan Remunda over 3 years

    Can I somehow disable rendering of root element of collection?

    This class with serialization attributes:

    [XmlRoot(ElementName="SHOPITEM", Namespace="")]
    public class ShopItem
    {
        [XmlElement("PRODUCTNAME")]
        public string ProductName { get; set; }       
        
        [XmlArrayItem("VARIANT")]
        public List<ShopItem> Variants { get; set; }
    }
    

    generates this XML:

    <SHOPITEM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <PRODUCTNAME>test</PRODUCTNAME>
          <Variants>
              <VARIANT>
                  <PRODUCTNAME>hi 1</PRODUCTNAME>
              </VARIANT>
              <VARIANT>
                  <PRODUCTNAME>hi 2</PRODUCTNAME>
              </VARIANT>           
          </Variants>        
    </SHOPITEM>
    

    I don't want <Variants> element here. What must I do?

    Also I don't need xsi and xsd namespaces in root element...

  • Rob Levine
    Rob Levine over 14 years
    oops - misread your post - thought you were trying to remove SHOPITEM - just editing answer!
  • dbc
    dbc almost 5 years
    Note you must also replace [XmlArray] if present.