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")]
.
Author by
Jan Remunda
I am interesting in designing and programing ASP.NET and windows applications in C#/VB.NET.
Updated on November 13, 2020Comments
-
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 over 14 yearsoops - misread your post - thought you were trying to remove SHOPITEM - just editing answer!
-
dbc almost 5 yearsNote you must also replace
[XmlArray]
if present.