Как сравнить 2 файла схемы xsd для эквивалентной функциональности - PullRequest
6 голосов
/ 28 ноября 2011

Я хотел бы сравнить две XSD-схемы A и B, чтобы определить, что все документы экземпляра, действительные для схемы A, также будут действительны для схемы B. Я надеюсь использовать это, чтобы доказать, что, хотя схемы A и B «разные» они фактически одинаковы. Примерами различий, которые не будут вызываться, будет схема A, использующая типы, а схема B объявляет все свои элементы встроенными.

Я нашел много людей, говорящих об «умных» инструментах типа diff, но они утверждают, что два файла различны, потому что они имеют разный текст, но в результате структура одинакова. Я нашел некоторые ссылки на XSOM, но я не уверен, поможет ли это или нет.

Есть мысли о том, как поступить?

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Мембранная модель SOA - Java API для WSDL и XML-схемы

package sample.schema;

import java.util.List;
import com.predic8.schema.Schema;
import com.predic8.schema.SchemaParser;
import com.predic8.schema.diff.SchemaDiffGenerator;
import com.predic8.soamodel.Difference;

public class CompareSchema {

  public static void main(String[] args) {
    compare();
  }

  private static void compare(){
    SchemaParser parser = new SchemaParser();

    Schema schema1 = parser.parse("resources/diff/1/common.xsd");

    Schema schema2 = parser.parse("resources/diff/2/common.xsd");

    SchemaDiffGenerator diffGen = new SchemaDiffGenerator(schema1, schema2);
    List<Difference> lst = diffGen.compare();
    for (Difference diff : lst) {
      dumpDiff(diff, "");
    }
  }

  private static void dumpDiff(Difference diff, String level) {
    System.out.println(level + diff.getDescription());
    for (Difference localDiff : diff.getDiffs()){
      dumpDiff(localDiff, level + "  ");
    }
  }
}

После выполнения вы получите вывод, показанный в листинге 2. Этосписок различий между двумя документами схемы.

ComplexType PersonType has changed:   Sequence has changed:
    Element id has changed:
      The type of element id has changed from xsd:string to tns:IdentifierType.

http://www.service -repository.com / предлагает онлайн компаратор версий XML-схемы инструмент, который отображает отчет о различиях между двумя XSD, которые, по-видимому, создаются на основе Мембранной модели SOA.

3 голосов
/ 28 ноября 2011

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

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

Таким образом, по сути, вы должны преобразовать обе XML-схемы в «каноническую форму» - какой бы инструмент вы ни строили или использовали, думает, что это форма, а затем выполнить сравнение.

Мой подход состоял в том, чтобы создать набор схем XML (может быть больше, чем один файл, если у вас есть больше пространств имен) для каждого корневого элемента, который мне нужен, поскольку мне было проще сравнивать XSD, созданные в стиле Russian Doll, начиная с Модель ПСВИ.

Затем я использовал такие опции, как автоматическое сопоставление членов группы замещения в сочетании с заменой групп замещения на выбор; удаление «лишних» последовательностей XML-схем, свертывание выбора из одного параметра или перемещение minOccurs / maxOccurs вокруг для композиторов с одним элементом и т. д.

В зависимости от возможностей вашего инструмента сравнения с XSD, или вы решите построить, вам также может понадобиться переставить частицы в таких композиторах, как xsd: choice или xsd: all; и т. д.

В любом случае, после всего этого я узнал, что чрезвычайно сложно создать инструмент, который бы хорошо работал для всех «крутых» функций XSD… Один из тестовых примеров, который я с любовью помню, был связан с различными xsd : любой контент.

Интересно, изменились ли вещи с тех пор ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...