Dapatkah saya menonaktifkan rendering elemen root dari koleksi?
Kelas ini dengan atribut serialisasi:
[XmlRoot(ElementName="SHOPITEM", Namespace="")]
public class ShopItem
{
[XmlElement("PRODUCTNAME")]
public string ProductName { get; set; }
[XmlArrayItem("VARIANT")]
public List<ShopItem> Variants { get; set; }
}
menghasilkan XML ini:
<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>
Saya tidak ingin <Variants>
elemen di sini. Apa yang harus saya lakukan?
Juga saya tidak membutuhkan ruang nama xsi dan xsd di elemen root ...
c#
serialization
attributes
Jan Remunda
sumber
sumber
Jawaban:
Untuk menonaktifkan rendering elemen root koleksi, Anda harus mengganti atribut
[XmlArrayItem]
dengan[XmlElement]
di kode Anda.Untuk menghapus ruang nama
xsi
danxsd
, buatXmlSerializerNamespaces
instance dengan namespace kosong dan teruskan saat Anda perlu membuat serial objek.Lihat contoh ini:
Saya mendapatkan hasil ini:
sumber
[XmlArray]
jika ada.Ganti
[XmlArrayItem("VARIANT")]
dengan[XmlElement("VARIANT")]
.sumber
Saya tidak percaya adalah mungkin untuk menghapus elemen ini menggunakan serialisasi xml default (dengan atribut). Jika Anda bisa melakukan ini, maka membuat serial
ShopItem
kelas Anda akan menghasilkan format xml yang buruk (tidak ada elemen root) untuk objek tersebut, yang tidak diizinkan.Namun, yang dapat Anda lakukan adalah menerapkan secara manual
IXmlSerializable
. Ini akan memberi Anda jenis kontrol yang sangat baik yang Anda inginkan.[ Sunting ] - maaf - salah membaca bahwa Anda mencoba menghapus Varian, bukan SHOPITEM. Untuk menghapus elemen "luar" Daftar, cukup tandai dengan atribut [XmlElement] daripada atribut [XmlArrayItem]. Ini akan menyebabkan entri daftar hanya menggunakan nama elemen yang ditentukan, tanpa membungkus daftar di elemen luar.
Untuk menghapus namespace, ini dikontrol oleh seriliazer itu sendiri, bukan markup di kelas. Saya baru saja memperhatikan bahwa sementara saya memperbarui jawaban ini, Rubens Farias telah memberikan balasan yang menunjukkan kepada Anda cara menghilangkan namespace.
sumber