Я пытаюсь десериализовать XML-документ с разными корневыми пространствами имен в класс C#.Deserialize XML-документ для класса C# с несколькими пространствами имен root (xmlns)
Короче говоря, я десериализации несколько версий подобного 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; }
}
Как вы можете видеть, жёстко namespace будет работать для версий 2.0, но будет сбой для других версий за исключением: «IndexRoot xmlns = 'http://tempuri/2012/1.0' не ожидалось."
Вопрос: Как я могу десериализовать XML на объект C#, принимая во внимание множественные пространства имен?
В идеале это отразилось бы на конкретном типе на версию. Но я даже соглашусь на получение «базового класса» с общими, совместно используемыми свойствами. В любом случае, я в настоящее время застрял с текущим жестко закодированным значением пространства имен в [XmlRoot].
Я пробовал:
- Добавление дублируют [XmlRoot] атрибуты (которые не поддерживаются)
- Создать базовый класс (BaseIndexRoot), выводя два экземпляра из него и декорирования этих дериватов с [XmlRoot ] атрибут (то же самое «не ожидается» ошибка)
- Удаление пространства имен все вместе приводит также к «не ожидается» ошибка