¿Puedo de alguna manera desactivar la representació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<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 aquí. ¿Que debo hacer?
Además, no necesito espacios de nombres xsi y xsd en el elemento raíz ...
c#
serialization
attributes
Jan Remunda
fuente
fuente
Respuestas:
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
yxsd
, cree unaXmlSerializerNamespaces
instancia con un espacio de nombres vacío y páselo cuando necesite serializar su objeto.Mira este ejemplo:
Tengo esta salida:
fuente
[XmlArray]
si está presente.Reemplazar
[XmlArrayItem("VARIANT")]
con[XmlElement("VARIANT")]
.fuente
No creo que sea posible eliminar este elemento utilizando la serialización xml predeterminada (con atributos). Si pudiera hacer esto, la serialización de su
ShopItem
clase daría como resultado un xml mal formado (sin elemento raíz) para el objeto, lo cual no está permitido.Sin embargo, lo que puede hacer es implementar manualmente
IXmlSerializable
. Esto le dará el tipo de control detallado que busca.[ Editar ] - lo siento - malinterpretó que intentaba eliminar Variantes, no SHOPITEM. Para eliminar el elemento "externo" de la lista, márquelo con un atributo [XmlElement] en lugar de un atributo [XmlArrayItem]. Esto hará que las entradas de la lista solo usen el nombre del elemento especificado, sin envolver la lista en un elemento externo.
Para eliminar los espacios de nombres, esto lo controla el propio seriliazer, no el marcado en la clase. Acabo de notar que aunque actualicé esta respuesta, Rubens Farias proporcionó una respuesta que le muestra cómo eliminar el espacio de nombres.
fuente