Каковы наилучшие методы для версий XML-схем?

Мне часто приходится разрабатывать схемы XML для разных процедур импорта XML-баз. Понятно, что XML-схемы будут развиваться со временем или они могут содержать исправления, поэтому важно зафиксировать версию схемы и связать какой-то механизм с конкретной версией.

В настоящее время у меня есть два сценария:

  • Ошибка найдена в схеме, и все экземпляры схемы должны соответствовать фиксированной версии.

  • Схема обновлена ​​и должна рассматриваться как предпочтительная, но также должна поддерживаться старая.

Наконец, я пришел с сохранением информации о версии в пространстве имен схемы:

targetNamespace="http://schemas.company.com/Geodesy/2010/River.xsd"

При исправлении ошибки я исправляю ее в том же пространстве имен, но если я собираюсь обновить схему, мне нужно создать новое пространство имен, но с добавленным месяцем обновления:

targetNamespace="http://schemas.company.com/Geodesy/2010/01/River.xsd"

И если у меня есть более одного обновления за месяц, просто добавьте еще один день:

targetNamespace="http://schemas.company.com/Geodesy/2010/01/17/River.xsd"

Знаете ли вы какой-нибудь лучший подход?

Ответ 1

Это такой сложный вопрос, что это даже не смешно, и тот, который я провел годы, предоставляя консультационную поддержку.

Существует много лучших практик, но большинство из них не работают во всех ситуациях. Например, многие выступают за использование "xsd: any", чтобы разрешать расширения, и это всего лишь рецепт катастрофы, если разработчики отвечают за сохранение схемы, превращая ее в дамп.

Вот несколько советов для вас, если вы начинаете:

  • Сделайте не поместить в ваше пространство имен младший номер версии, номер версии микро, дату или что-то еще в этом роде. Каждый раз, когда вы меняете пространство имен, вы разбиваете все обрабатывающие приложения.
  • Do поместите атрибут "version" в документ экземпляра XML. Это позволит обработчику или службе адаптера версии выяснить, что она обрабатывает.
  • Укажите политику того, что представляет собой обратное совместимое изменение, например: добавление необязательных элементов не приведет к разрыву отправителей и не будет прерывать приемники, если они используют политику игнорирования элементов, которые они не выполняют знать (JAXB и XMLBeans могут быть настроены таким образом)

Удача удачи!