Я получил набор файлов XSD от поставщика. Мне нужно десериализовать XML документы, сгенерированные инструментом вендора, в классы, полученные из определения схемы. Я могу сгенерировать эти классы из файлов XSD, но все автоматически сгенерированные классы имеют информацию о пространстве имен, например:
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://example.com/XMLSchema/MT/Generic/xxx/v1.5.1")]
[System.Xml.Serialization.XmlRootAttribute("Instance", Namespace = "http://example.com/XMLSchema/MT/Generic/xxx/v1.5.1", IsNullable = false)]
Файлы XML присваиваются аналогичным образом:
<xxx:Instance xmlns:xxx="http://example.com/XMLSchema/MT/Generic/xxx/v1.5.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://example.com/XMLSchema/MT/Generic/xxx/v1.5.1 xxx.xsd">
Вот в чем проблема: мне нужно обрабатывать десериализацию разных версий (входящая версия XML варьируется, и у меня есть несколько версий XSD / автоматически генерируемого класса), но мой элементарный подход десериализации срывается, если версия не совпадает между XML и XSD / классом. Вот что я использую:
var serializer = new XmlSerializer(typeof(InstanceType));
InstanceType instanceType;
using (var reader = new StreamReader(@"/path/to/file.xml"))
{
instanceType = (InstanceType)serializer.Deserialize(reader);
reader.Close();
}
Я достаточно уверен, что более новые версии имеют обратную совместимость (сериализацию с допустимой версией), и я могу успешно десериализовать XML, если я изменю версию пространства имен в классы auto-gen'd, чтобы соответствовать. К сожалению, это не является устойчивым решением, поэтому я ищу что-то лучшее.
Могу ли я:
- Поддерживать только последнюю версию XSD / auto -гендируемые классы;
- десериализовать более старые версии XML в новую версию класса;
- Accompli sh это программно в моей процедуре десериализации, без изменений в XML файлы или классы auto-gen'd?
Я полагаю, что мне чего-то не хватает, если б c ... ценить, если кто-то может показать мне путь.