Опитвам се да десериализирам XML документ, с различни основни пространства от имена, до C# клас.
Накратко, искам да десериализирам множество версии на подобен xml документ така:
<IndexRoot Code="0664" xmlns="http://tempuri/2012/1.0">
<Name>Foo</Name>
<Color>blue</Color>
...
</IndexRoot>
<IndexRoot Code="0678" xmlns="http://tempuri/2012/2.0">
<Name>Bar</Name>
<Character>Smurf</Character>
</IndexRoot>
Всяка версия очевидно може да има различни елементи под нея и въпреки че повечето елементи са еднакви, има някои разлики. В примера по-горе атрибутът Name е наличен във всяка версия, докато Color/Character са уникални за всяка версия.
В идеалния случай искам да абстрахирам това до проста функция, която ми дава отразен конкретен клас. Така:
public IndexRoot Get(string fileName) {
var doc = XDocument.Load(fileName);
return xmlSerializer.Deserialize<IndexRoot>(doc);
}
В текущата ми настройка това се проваля, защото се изисква да се предостави едно пространство от имена на основния елемент, за да може десериализаторът да работи:
[Serializable, XmlRoot(ElementName = "IndexRoot", Namespace = "http://tempuri/2012/2.0")]
public class IndexRoot
{
[XmlAttribute("Code")]
public string Code { get; set; }
[XmlElement(ElementName = "Name")]
public string Name { get; set; }
}
Както можете да видите, твърдо кодираното пространство от имена ще работи за версии 2.0, но ще се провали за други версии с изключение: "IndexRoot xmlns='http://tempuri/2012/1.0' не се очакваше.“
Въпросът: как мога да десериализирам XML в C# обект, като взема предвид множеството основни пространства от имена?
В идеалния случай това ще бъде отразено в конкретен тип за всяка версия. Но дори ще се задоволя с получаването на "базов клас" с общите, споделени свойства. Така или иначе, в момента съм заседнал с текущата твърдо кодирана стойност на пространството от имена на [XmlRoot].
Опитах:
- Добавяне на дублирани [XmlRoot] атрибути (което не се поддържа)
- Създайте базов клас (BaseIndexRoot), извличайки два екземпляра от него и украсявайки тези производни с атрибута [XmlRoot] (същата грешка „не се очаква“)
- Премахването на пространството от имена заедно също води до грешката „не се очакваше“.