Версия-агности c XML десериализация - PullRequest
0 голосов
/ 12 марта 2020

Я получил набор файлов 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 ... ценить, если кто-то может показать мне путь.

...