2011-11-28 51 views
6

Me gustaría comparar 2 esquemas XSD A y B para determinar que todos los documentos de instancia válidos para el esquema A también serían válidos para el esquema B. Espero usar esto para probar que aunque los esquemas A y B son "diferentes", en realidad son lo mismo. Ejemplos de diferencias que esto no desencadenaría serían el esquema A utiliza tipos y el esquema B declara todos sus elementos en línea.Cómo comparar 2 archivos de esquema xsd para funcionalidad equivalente

He encontrado mucha gente que habla de herramientas tipo diff "inteligentes", pero estos afirman que los dos archivos son diferentes porque tienen un texto diferente pero la estructura resultante es la misma. Encontré algunas referencias a XSOM pero no estoy seguro si eso ayudará o no.

¿Alguna idea de cómo proceder?

Respuesta

3

Mi enfoque para esto era canonicalizar la representación del esquema XML.

Lamentablemente, también puedo decirles que, a diferencia de la canonicalización de documentos XML (utilizada, por ejemplo, para calcular una firma digital), no es tan simple ni uniforme.

Así que, básicamente, tiene que transformar ambos esquemas XML a una "forma canónica", cualquiera que sea la herramienta que construya o use piensa de esa forma, y ​​luego haga la comparación.

Mi enfoque era crear un conjunto de esquemas XML (podría ser más de un archivo si tienes más espacios de nombres) para cada elemento raíz que necesitaba, ya que me resultaba más fácil comparar XSD creadas con el estilo Russian Doll, empezando por el modelo PSVI.

Luego utilicé opciones tales como la coincidencia automática de los miembros del grupo de sustitución junto con la sustitución de los grupos de sustitución con una opción; eliminación de secuencias de esquemas XML "superfluas", colapso de opciones de opciones individuales o movimiento de entradas mínimas/oportunidades máximas para compiladores de elementos individuales, etc.

Dependiendo de las características de su herramienta de comparación con XSD, o si decide instalar, usted también podría tener que reorganizar las partículas en los compositores, como xsd: choice o xsd: all; etc.

De todos modos, lo que aprendí después de todo fue que es extremadamente difícil construir una herramienta que funcione bien para todas las características "geniales" de XSD ... Un caso de prueba que recuerdo con cariño fue el de tratar con varios xsd: cualquier contenido.

me pregunto aunque si las cosas han cambiado desde ...

+0

Darn Tenía la esperanza de que hubiera alguna manera "simple" que me estaba perdiendo. La publicación que no puedo encontrar y que está atrapada en mi cabeza fue a lo largo de las líneas de XSOM que es la canonización del XSD que luego podría ser comparado. ¿Qué herramientas de comparación de XSD usabas? –

+0

XSOM no es una canonización del XSD, seguro; tal vez se estaban refiriendo a la "vista" de PSVI que XSOM compila para ti. Pero eso solo podría usarse para ciertos escenarios muy básicos. Todavía tendrá que aplicar sus transformaciones personalizadas para generar nuevos XSD si desea que las herramientas externas hagan la comparación por usted.No tengo conocimiento (ni lo he aprendido aún) de ningún XSOM que serialice la vista PSVI de nuevo en un archivo XSD ... Terminé escribiendo toda una herramienta yo mismo, y finalmente lo califiqué como una Refactorización de esquemas XML; la conversión a una muñeca rusa no sobrevivió a la versión 1.0 ... –

4

Membrane SOA Model - Java API for WSDL and XML Schema

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 + " "); 
    } 
    } 
} 

After executing you get the output shown in listing 2. It is a List of differences between the two Schema documents.

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/ ofrece una herramienta en línea XML Schema Version Comparator que muestra un informe de las diferencias entre dos XSD que parece ser producido a partir del Modelo SOA de Membrana.

+0

La versión que está disponible para descargar no funciona. A una de las bibliotecas dentro de la suya le falta un archivo .class: Excepción en el hilo "principal" java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/BytecodeInterface8. LE: aparentemente funciona si descarga Groovy 1.8.6 manualmente y lo agrega a la ruta de compilación. – Buffalo

+0

Hola ... He intentado con su ejemplo pero no funciona para mí. Estoy tratando de comparar dos archivos de esquema, uno está completamente estructurado y el otro está en línea (el esquema real se importa mediante importación). ¿Podría ayudarme por favor? ? –

+0

Gracias. Esto es a lo que me he aferrado por algún tiempo. ¿Alguna idea de cómo se pueden filtrar las diferencias y hacer que solo las diferencias eliminadas del Elemento sean visibles? – mattymanme

Cuestiones relacionadas