Tengo una aplicación que guarda documentos (piense en documentos word) en un formato Xml. Actualmente, las clases C# generadas a partir de archivos xsd se utilizan para leer/escribir el formato del documento y todo estuvo bien hasta hace poco cuando tuve que hacer un cambio en el formato del documento. Mi preocupación es la compatibilidad con versiones anteriores ya que las versiones futuras de mi aplicación necesitan para poder leer documentos guardados por todas las versiones anteriores y, idealmente, también quiero que las versiones anteriores de mi aplicación puedan manejar documentos de lectura guardados en versiones futuras de mi aplicación¿Cómo debo administrar diferentes formularios incompatibles de documentos basados en Xml?
Por ejemplo, suponiendo que cambie el esquema de mi documento de añadir una (opcional) elemento extra en alguna parte, versiones a continuación antiguas de mi aplicación simplemente ignorar la elemnt extra y no habrá ningún problema:
<doc>
<!-- Existing document -->
<myElement>Hello World!</myElement>
</doc>
Sin embargo, si se realiza un cambio radical (un atributo se cambia en un elemento, por ejemplo, o una colección de elementos), las versiones anteriores de mi aplicación deben ignorar este elemento si es opcional o informar al usuario que están intentando para leer un documento guardado con una versión más nueva de mi aplicación de lo contrario. También esto me está causando dolores de cabeza ya que todas las versiones futuras de mi aplicación necesitan un código completamente separado para leer los dos documentos diferentes.
Un ejemplo de tal cambio sería el siguiente código XML:
<doc>
<!-- Existing document -->
<someElement contents="12" />
</doc>
Cambiar a:
<doc>
<!-- Existing document -->
<someElement>
<contents>12</contents>
<contents>13</contents>
</someElement>
</doc>
Con el fin de prevenir los dolores de cabeza de apoyo en el futuro que quería llegar a una decente estrategia para manejar los cambios que podría hacer en el futuro, de modo que las versiones de mi aplicación que lanzo ahora puedan hacer frente a estos cambios en el futuro:
- ¿Debe guardarse el "número de versión" del documento en el documento y, de ser así, qué estrategia de control de versiones debe usarse? Si la versión del documento coincide con la versión del ensamblado .exe, o si se debe usar una estrategia más compleja (por ejemplo, revisión mayor cambiada indica cambios de interrupción, cuando los incrementos menores de revisión indican cambios sin interrupción, por ejemplo, elementos adicionales opcionales)
- What ¿Debería usar el método para leer el documento y cómo evitar la duplicación de grandes cantidades de código para diferentes versiones de documentos?
- Aunque XPath es obviamente más flexible, es mucho más trabajo de implementar que simplemente generar clases con xsd.
- Por otro lado, si se utiliza el análisis DOM, entonces se necesitaría una nueva copia del documento xsd en el control de origen para cada cambio de interrupción, causando problemas si las correcciones alguna vez se deben aplicar a esquemas anteriores (las versiones anteriores de la aplicación todavía compatible).
Además, he trabajado todo esto muy loosly en el supuesto de que todos los cambios que realice se pueden dividir en dos categorías de estos "cambios Beaking" y "cambios" no separación, pero estoy no del todo convencido de que es una suposición segura de realizar.
Tenga en cuenta que utilizo el término "documento" muy vagamente: ¡el contenido no se parece en nada a un documento!
Gracias por cualquier consejo que me puede ofrecer.
Totalmente de acuerdo con este XSLT eres tu amigo, de esta manera puedes crear un XSL que simplemente modifique el doc lo suficiente como para llevarlo a un estado conocido para esa versión. Podrías tener montones de ellos por cada cambio de versión y luego en tu control de fuente solo necesitas almacenar el XSL con cada cambio de formato similar a Migraciones en Rudy on Rails –
Estoy de acuerdo en que XSLT es una forma hábil de hacerlo, pero no me gustaría relacionarlo la versión del formato XML al número de versión de la aplicación (ver mi respuesta para mi razonamiento). –
@ 17 of 26 es correcto, definitivamente necesitará nuevas versiones para algunos parches y para compilaciones provisionales, y no necesitará necesariamente uno por versión principal. – Ishmael