XSD обратная совместимость
У меня есть XSD-файл со схемой, которая используется для определения интерфейса XML для отправки значений в мое приложение с удаленных клиентов. Прямо сейчас XSD имеет, скажем, для простоты 3 элемента.
Таким образом, чтобы сериализовать и десериализовать это в C#, я могу использовать инструмент xsd.exe для генерации классов C# и использовать эти классы для сериализации и десериализации XML по отношению к XSD.
Это работает, но затем позвольте мне сказать, что я создаю новую версию XSD с новым четвертым элементом, чтобы включить некоторые функции на стороне сервера, если этот элемент указан для новых удаленных клиентов, но я все еще хочу поддерживать старый XSD (не хотите или можете изменить программное обеспечение старых удаленных клиентов), но новые классы, сгенерированные из нового XSD, не будут совместимы со старым XML из старого XSD.
Я полагаю, что я мог бы читать XML непосредственно с помощью XDocument или аналогичного, но я хочу иметь возможность принимать только те XML, которые могут быть проверены на соответствие одному из XSD (и затем принимать решение на стороне сервера в зависимости от того, какую версию XSD он проверяет), Это связано с проблемами взаимоотношений с клиентами.
Какова лучшая практика для решения этих вопросов?
2 ответа
Если я вас правильно понимаю, вам не нужно поддерживать несколько XSD, если все, что вы пытаетесь сделать, это добавить дополнительный элемент в схему. Вместо этого, если вы установите значение "minOccurs" на 0 для этого нового элемента и создадите заново файл CS и будете использовать его для десериализации ваших объектов, это должно позволить вам десериализовать запросы, когда элемент присутствует, а когда нет. подарок. Затем вы можете просто оценить, является ли свойство десериализованного объекта нулевым, чтобы определить, должна ли новая функция быть включена или нет. Смотрите пример XSD ниже:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ClassName" nillable="true" type="ClassName" />
<xs:complexType name="ClassName">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Property1" type="Property1Type" />
<xs:element minOccurs="0" maxOccurs="1" name="Property2" type="Property2Type" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Рекомендуется избегать технологии привязки данных, если ваша схема может измениться, особенно если вам нужно обрабатывать несколько вариантов. По сути, XML разработан для гибкости, а языки, такие как C#, - нет, поэтому, если вы компилируете код C# для отражения конкретной схемы, вы блокируете себя. Привязка данных хороша, если ничего не меняется, но если вам нужно обрабатывать разнообразие и изменения затем либо используйте общий подход (такой как DOM), либо используйте специфичные для XML языки обработки, такие как XSLT и XQuery.