Serialización XML: deshabilita el elemento raíz de representación de la matriz

¿Puedo de alguna manera desactivar la renderización del elemento raíz de la colección?

Esta clase con atributos de serialización:

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

genera este XML:

  test   hi 1   hi 2    

No quiero el elemento aquí. ¿Que debo hacer?

Además, no necesito espacios de nombres xsi y xsd en el elemento raíz …

Para deshabilitar la representación del elemento raíz de la colección, debe reemplazar el atributo [XmlArrayItem] con [XmlElement] en su código.

Para eliminar los xsd nombres xsi y xsd , cree una instancia XmlSerializerNamespaces con un espacio de nombre vacío y páselo cuando necesite serializar su objeto.

Echa un vistazo a este ejemplo:

 [XmlRoot("SHOPITEM")] public class ShopItem { [XmlElement("PRODUCTNAME")] public string ProductName { get; set; } [XmlElement("VARIANT")] // was [XmlArrayItem] public List Variants { get; set; } } // ... ShopItem item = new ShopItem() { ProductName = "test", Variants = new List() { 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 

Obtuve esta salida:

   test  hi 1   hi 2   

Reemplace [XmlArrayItem("VARIANT")] con [XmlElement("VARIANT")] .

No creo que sea posible eliminar este elemento utilizando la serialización xml predeterminada (con atributos). Si pudiera hacer esto, entonces serializar su clase ShopItem daría como resultado un xml mal formado (sin elemento raíz) para el objeto, lo que no está permitido.

Sin embargo, lo que puede hacer es implementar manualmente IXmlSerializable . Esto le proporcionará el tipo de control detallado que necesita.

[ Editar ] – lo siento – leí mal que estabas tratando de eliminar variantes, no SHOPITEM. Para eliminar el elemento List “outer”, simplemente márcalo con un atributo [XmlElement] en lugar de un atributo [XmlArrayItem]. Esto hará que las entradas de la lista simplemente usen el nombre del elemento especificado, sin envolver la lista en un elemento externo.

Para eliminar los espacios de nombres, esto es controlado por el seriliazer en sí, no el marcado en la clase. Me acabo de dar cuenta de que, aunque actualicé esta respuesta, Rubens Farias me ha proporcionado una respuesta que le muestra cómo eliminar el espacio de nombres.