2010-01-05 13 views
96

¿Puedo de alguna manera desactivar la representación del elemento raíz de la colección?Serialización XML - Desactivar el elemento raíz de representación de la matriz

Esta clase con la serialización atributos:

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

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

genera este 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> 

no quiero <Variants> elemento de aquí. ¿Que debo hacer?

también que no es necesario xsi y xsd espacios de nombres en el elemento raíz ...

Respuesta

151

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 espacios de nombres xsi y xsd, cree una instancia XmlSerializerNamespaces con un espacio de nombres vacío y páselo cuando necesite serializar su objeto.

echar un vistazo a este ejemplo:

[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 

que tiene esta salida:

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

Gran respuesta ... – camainc

1

que no creen que es posible eliminar este elemento utilizando la serialización XML por defecto (con atributos). Si pudieras hacer esto, entonces serializar tu clase ShopItem daría como resultado un xml mal formado (sin elemento raíz) para el objeto, que no está permitido.

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

[Editar] - Lo siento, leí mal que estaba 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 de la clase. Acabo de notar que, aunque actualicé esta respuesta, Rubens Farias me ha proporcionado una respuesta que le muestra cómo eliminar el espacio de nombres.

+0

oops - leí tu publicación erróneamente - creías que estabas intentando eliminar SHOPITEM - ¡solo editabas la respuesta! –

28

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

Cuestiones relacionadas