Я пытаюсь десериализовать 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 доступен в каждой версии, а цвет / символ уникальны для каждой версии.
В идеале я хочу абстрагировать это до простой функции, которая дает мне отраженный конкретный класс. Вот так:
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] (та же ошибка "не ожидалось")
- Удаление всего пространства имен также приводит к ошибке "не ожидалось".