Czy mogę jakoś wyłączyć renderowanie głównego elementu kolekcji?
Ta klasa z atrybutami serializacji:
[XmlRoot(ElementName="SHOPITEM", Namespace="")]
public class ShopItem
{
[XmlElement("PRODUCTNAME")]
public string ProductName { get; set; }
[XmlArrayItem("VARIANT")]
public List<ShopItem> Variants { get; set; }
}
generuje ten 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>
Nie chcę <Variants>
tutaj elementu. Co muszę zrobić?
Nie potrzebuję też przestrzeni nazw xsi i xsd w elemencie głównym ...
c#
serialization
attributes
Jan Remunda
źródło
źródło
Odpowiedzi:
Aby wyłączyć renderowania elementu głównego zbioru, należy wymienić atrybut
[XmlArrayItem]
ze[XmlElement]
w kodzie.Aby usunąć przestrzenie nazw
xsi
ixsd
, utwórzXmlSerializerNamespaces
wystąpienie z pustą przestrzenią nazw i przekaż je, gdy musisz serializować obiekt.Spójrz na ten przykład:
Mam to wyjście:
źródło
[XmlArray]
jeśli jest obecny.Wymień
[XmlArrayItem("VARIANT")]
się[XmlElement("VARIANT")]
.źródło
Nie sądzę, aby można było usunąć ten element przy użyciu domyślnej serializacji XML (z atrybutami). Gdybyś mógł to zrobić, serializacja
ShopItem
klasy spowodowałaby źle sformułowany kod XML (brak elementu głównego) dla obiektu, co jest niedozwolone.Możesz jednak zrobić to ręcznie
IXmlSerializable
. To da ci precyzyjną kontrolę, której szukasz.[ Edytuj ] - przepraszam - źle odczytałeś, że próbujesz usunąć warianty, a nie SHOPITEM. Aby usunąć element „zewnętrzny” listy, wystarczy oznaczyć go atrybutem [XmlElement], a nie atrybutem [XmlArrayItem]. Spowoduje to, że wpisy listy będą używać tylko określonej nazwy elementu, bez zawijania listy zewnętrznym elementem.
Aby usunąć przestrzenie nazw, jest to kontrolowane przez sam seriliazer, a nie przez znaczniki w klasie. Właśnie zauważyłem, że kiedy zaktualizowałem tę odpowiedź, Rubens Farias dostarczył odpowiedź, która pokazuje, jak wyeliminować przestrzeń nazw.
źródło