Posso desativar a renderização do elemento raiz da coleção?
Esta classe com atributos de serialização:
[XmlRoot(ElementName="SHOPITEM", Namespace="")]
public class ShopItem
{
[XmlElement("PRODUCTNAME")]
public string ProductName { get; set; }
[XmlArrayItem("VARIANT")]
public List<ShopItem> Variants { get; set; }
}
gera 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>
Eu não quero <Variants>
elemento aqui. O que devo fazer?
Além disso, não preciso de namespaces xsi e xsd no elemento raiz ...
c#
serialization
attributes
Jan Remunda
fonte
fonte
Respostas:
Para desativar a renderização do elemento raiz da coleção, você deve substituir o atributo
[XmlArrayItem]
por[XmlElement]
em seu código.Para remover os namespaces
xsi
exsd
, crie umaXmlSerializerNamespaces
instância com um namespace vazio e passe-o quando precisar serializar seu objeto.Dê uma olhada neste exemplo:
Eu tenho esta saída:
fonte
[XmlArray]
se houver.Substitua
[XmlArrayItem("VARIANT")]
por[XmlElement("VARIANT")]
.fonte
Não acredito que seja possível remover este elemento usando a serialização xml padrão (com atributos). Se você pudesse fazer isso, serializar sua
ShopItem
classe resultaria em xml mal formado (sem elemento raiz) para o objeto, o que não é permitido.O que você pode fazer, no entanto, é implementar manualmente
IXmlSerializable
. Isso lhe dará o tipo de controle refinado que você procura.[ Editar ] - desculpe - interpretou mal que você estava tentando remover Variants, não SHOPITEM. Para remover o elemento "externo" da Lista, basta marcá-lo com um atributo [XmlElement] em vez de um atributo [XmlArrayItem]. Isso fará com que as entradas da lista usem apenas o nome do elemento especificado, sem envolver a lista em um elemento externo.
Para remover os namespaces, isso é controlado pelo próprio seriliazer, não pela marcação na classe. Acabei de notar que, embora tenha atualizado esta resposta, Rubens Farias forneceu uma resposta que mostra como eliminar o namespace.
fonte