Можно ли как-то произвести десериализацию разных по названию элементов, но одинакового содержимого в один список?
XML
<template>
<images>
<small>
</small>
<large>
</large>
<small>
</small>
<large>
</large>
</images>
</template>
CODE
public class myclass
{
[XmlElement("small")]
[XmlElement("large")]
ObservableCollection<MyImage> myimage
{get;set;}
}
При таком определении, он ругается, что необходимо указать XmlChoiceIdentifierAttribute Хотя как мне кажется, он тут не причем...
Писать свой десериализатор очень не хочется.
PS: Или, конечно, как вариант, можно попробовать сделать два разных списка, а потом в ListView из привязать мультибиндингом? Как правильнее подойти к этому вопросу?
Я сгенерировал набор классов по представленному XML с помощью Студии: Edit > Paste Special > Paste XML As Classes. Обработал их напильником, убрав все лишние атрибуты и поля.
Также я предположил, что элементы должны содержать в себе вложенные свойства. Примерно так:
<template>
<images>
<small>
<size>100</size>
</small>
<large>
<size>1000</size>
</large>
<small>
<size>110</size>
</small>
<large>
<size>1100</size>
</large>
</images>
</template>
В итоге у меня получился такой набор классов:
[XmlRoot("template")]
public class Template
{
[XmlElement("images")]
public TemplateImages Images { get; set; }
}
public class TemplateImages
{
[XmlElement("large", typeof(Image))]
[XmlElement("small", typeof(Image))]
[XmlChoiceIdentifier("ItemsElementName")]
public Image[] Items { get; set; }
//[XmlElement("ItemsElementName")]
//[XmlIgnore()]
public ItemsChoiceType[] ItemsElementName { get; set; }
}
public enum ItemsChoiceType
{
large,
small,
}
public class Image
{
[XmlElement("size")]
public int Size { get; set; }
}
Вроде работает и без закомментированных атрибутов.
using (var fs = new FileStream("test.xml", FileMode.Open))
{
var xs = new XmlSerializer(typeof(Template));
var template = (Template)xs.Deserialize(fs);
foreach (var item in template.Images.Items)
Console.WriteLine(item.Size);
foreach (var name in template.Images.ItemsElementName)
Console.WriteLine(name);
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей