J'ai une application qui enregistre des documents (pensez à des documents Word) dans un format XML - Actuellement, les classes C# générées à partir de fichiers xsd sont utilisées pour lire/écrire le format du document et tous était bien jusqu'à récemment quand je devais faire un changement du format du document. Mon souci est la compatibilité ascendante puisque les futures versions de mon application ont besoin de pour pouvoir lire les documents sauvegardés par toutes les versions précédentes et, idéalement, je veux aussi que les anciennes versions de mon application puissent gérer avec élégance les documents lus par les futures versions de mon app.Comment gérer différentes formes incompatibles de documents Xml
Par exemple, en supposant que je change le schéma de mon document pour ajouter un (en option) élément supplémentaire quelque part, puis les anciennes versions de mon application ignoreront simplement le elemnt supplémentaire et il n'y aura pas de problème:
<doc>
<!-- Existing document -->
<myElement>Hello World!</myElement>
</doc>
Cependant, si une modification de rupture est effectuée (un attribut est changé en un élément, par exemple, ou une collection d'éléments), alors les versions antérieures de mon application devraient soit ignorer cet élément si elle est facultative, soit informer l'utilisateur qu'elles tentent pour lire un document enregistré avec une version plus récente de mon application autrement. Aussi cela me cause actuellement des maux de tête car toutes les versions futures de mon application nécessitent un code entièrement séparé est nécessaire pour lire les deux documents différents.
Un exemple d'un tel changement serait le code XML suivant:
<doc>
<!-- Existing document -->
<someElement contents="12" />
</doc>
Changer à:
<doc>
<!-- Existing document -->
<someElement>
<contents>12</contents>
<contents>13</contents>
</someElement>
</doc>
Afin d'éviter les maux de tête de soutien à l'avenir que je voulais venir avec une vie décente stratégie pour gérer les changements que je pourrais faire à l'avenir, de sorte que les versions de mon application que je publie maintenant vont être en mesure de faire face à ces changements dans le futur:
- Le "numéro de version" du document doit-il être stocké dans le document lui-même, et si oui, quelle stratégie de versionage doit-on utiliser? Si la version du document correspond à la version de l'assembly .exe, ou si une stratégie plus complexe doit être utilisée (par exemple, une révision majeure indique des changements brusques, alors que des incréments de révision mineurs indiquent des modifications non-brisées - par exemple des éléments facultatifs). méthode dois-je utiliser pour lire le document lui-même et comment puis-je éviter de répliquer des quantités massives de code pour différentes versions de documents?
- Bien que XPath soit évidemment le plus flexible, c'est beaucoup plus de travail à implémenter que de simplement générer des classes avec xsd. D'autre part, si l'analyse DOM est utilisée, une nouvelle copie du document xsd sera nécessaire dans le contrôle de source pour chaque changement de rupture, ce qui pose des problèmes si des correctifs doivent être appliqués aux anciens schémas (les anciennes versions de l'application toujours supporté).
De plus, je travaille tout cela très loosly sur l'hypothèse que tous les changements que je fais peut être divisé en ces deux catégories de « changements de débecquage » et « changements insécables », mais je suis pas entièrement convaincu que c'est une hypothèse sûre à faire.
Notez que j'utilise le terme "document" de manière très lâche - le contenu ne ressemble en rien à un document!
Merci pour tous les conseils que vous pouvez m'offrir.
Tout à fait d'accord avec ce XSLT est votre ami, de cette façon, vous pouvez créer un XSL qui modifierait simplement le document assez pour obtenir un état connu pour cette version. Vous pourriez avoir des charges pour chaque changement de version puis dans votre contrôle de source vous avez seulement besoin de stocker le XSL avec chaque changement de format similaire à Migrations dans Rudy on Rails –
Je suis d'accord que XSLT est une façon élégante de le faire, mais je ne ferais pas la version du format XML au numéro de version de l'application (voir ma réponse pour mon raisonnement). –
@ 17 of 26 est exact, vous aurez besoin de nouvelles versions pour certains correctifs et pour les versions intermédiaires, et vous n'en aurez pas besoin nécessairement d'une version majeure. – Ishmael