Как сравнить два xsd файла
Я хотел бы сравнить 2 схемы XSD A и B, чтобы определить, что все документы экземпляра, действительные для схемы A, также будут действительны для схемы B. Я надеюсь использовать это, чтобы доказать, что хотя схемы A и B "различны", они эффективно тот же самый. Примерами различий, которые это не вызывает, было бы то, что Схема A использует типы, а Схема B объявляет все свои элементы встроенными.
Я нашел много людей, говорящих об "умных" инструментах типа diff, но они утверждают, что эти два файла различны, потому что у них разный текст, но итоговая структура одинакова. Я нашел некоторые ссылки на XSOM, но я не уверен, поможет ли это или нет.
Есть мысли о том, как поступить?
2 ответа
После выполнения вы получите результат, показанный в листинге 2. Это список различий между двумя документами схемы.
Мой подход к этому состоял в том, чтобы канонизировать представление XML-схемы.
К сожалению, я также могу сказать вам, что, в отличие от канонизации XML-документов (используемых, например, для вычисления цифровой подписи), это не так просто или даже стандартизировано.
Таким образом, по сути, вы должны преобразовать обе XML-схемы в "каноническую форму" - какой бы инструмент вы ни строили или использовали, думает, что форма есть, а затем сравнивать.
Мой подход состоял в том, чтобы создать набор XML-схем (может быть больше, чем один файл, если у вас есть больше пространств имен) для каждого корневого элемента, который мне был нужен, поскольку мне было проще сравнивать XSD, созданные в стиле Russian Doll, начиная с модели PSVI.
Затем я использовал такие опции, как автоматическое сопоставление членов группы замещения в сочетании с заменой групп замещения на выбор; удаление "лишних" последовательностей XML-схем, свертывание выбора одного параметра или перемещение minOccurs/maxOccurs вокруг для композиторов с одним элементом и т. д.
В зависимости от возможностей вашего инструмента сравнения с XSD, или вы решите построить, вам также может понадобиться переставить частицы в таких композиторах, как xsd:choice или xsd:all; и т.п.
Во всяком случае, после всего этого я узнал, что чрезвычайно сложно создать инструмент, который бы хорошо работал для всех "крутых" функций XSD… Один из тестовых примеров, который я с любовью помню, был связан с различным xsd: любым контентом,
Читайте также: