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...
To disable rendering of root element of collection, you must replace the attribute
[XmlArrayItem]
with[XmlElement]
in your code.For removing the
xsi
andxsd
namespaces, create anXmlSerializerNamespaces
instance with an empty namespace and pass it when you need to serialize your object.Take a look on this example:
I got this output:
I don't believe it is possible to remove this element using the default xml serialization (with attributes). If you could do this, then serializing your
ShopItem
class would result in badly formed xml (no root element) for the object, which is not allowed.What you can do however, is manually implement
IXmlSerializable
. This will give you the sort of fine-grained control you a re after.[Edit] - sorry - misread that you were trying to remove Variants, not SHOPITEM. To remove the List "outer" element, just mark it up with an [XmlElement] attribute rather than an [XmlArrayItem] attribute. This will cause the list entries to just use the specified element name, without wrapping the list in an outer element.
For removing the namespaces, this is controlled by the seriliazer itself, not the markup on the class. I've just noticed that while I've updated this answer, Rubens Farias has provided an reply that shows you how to eliminate the namespace.
Replace
[XmlArrayItem("VARIANT")]
with[XmlElement("VARIANT")]
.