2009-10-23 9 views
0

D'abord, laissez-moi commencer par vous dire les détails sur le problème que j'essaie de résoudre.Diffuser/Fusionner des documents Xml par programmation

Nous avons une application tierce qui utilise des documents XML pour stocker toute sa logique métier et rechercher des tables et autres. L'application possède un ensemble de fichiers Xml de base et utilise un type de modèle d'héritage pour exposer les fichiers XML hérités que nous devons modifier pour personnaliser la logique métier. Je dis "sorte de" en raison de l'horrible mise en œuvre de l'héritage qu'il utilise.

Actuellement, il existe plus de 3000 fichiers XML séparés allant de 1k à 5000k et totalisant environ 600MB. La seule bonne chose à ce jour, c'est qu'ils utilisent tous la même Xsd. Notre problème est que nous recevons des mises à jour mensuelles des fichiers Xml de base, que nous sommes censés les mettre en place et mettre à jour nos documents personnalisés pour les aligner sur la nouvelle version des documents de base. Nous le faisons actuellement manuellement, en utilisant DiffDog, et reconstituons les documents pour en créer de nouveaux, mais j'essaie de comprendre ce qu'il est possible de faire par programmation. Voyons si je peux visualiser ceci pour vous:

Nous commençons avec une structure comme ceci ci-dessous, avec le modèle de base en place, et un modèle personnalisé que nous pouvons définir nos règles personnalisées dans (Qui nous faisons beaucoup)

.. \ LineOfBusiness \ BaseTemplates \ BaseXml_1_0_0_0.xml
.. \ LineOfBusiness \ CustomTemplates \ Document_1_0_0_0.xml

nous sommes alors donné une mise à niveau chaque mois maintenant, nous avons une structure comme celle-ci:

.. \ LineOfBusiness \ BaseTemplates \ BaseXml_1_0_0_0.xml
.. \ LineOfBusiness \ BaseTemplates \ BaseXml_1_1_0_0.xml
.. \ LineOfBusiness \ CustomTemplates \ Document_1_0_0_0.xml

Notre travail consiste essentiellement à créer le

.. \ LineOfBusiness \ CustomTemplates \ Document_1_1_0_0.xml

documents nous-mêmes chaque mois, ce qui porte les changements apportés à la version précédente, dans la nouvelle logique de versions.

Je sais que ce système est ridicule, mais je ne peux pas le changer aujourd'hui. Toutes les idées sur la façon d'aborder ce problème seraient géniales. Je peux vous dire ce que j'ai pensé jusqu'à présent ...

  1. Désérialise la base et documents personnalisés anciens de version pour obtenir une liste des différences spécifiques, l'application de ces différences à une version désérialisé de la nouvelle base et appliquez les différences, puis reserialize à xml.

  2. Appliquez une sorte de processus d'annotation aux modèles personnalisés afin de pouvoir extraire les différences par programme au moment de la mise à niveau.

  3. Externaliser le processus de mise à niveau ...

+0

quelle langue utilisez-vous? –

+0

Nous sommes principalement un magasin Microsoft ici, même si nous avons deux développeurs Java. Mais la langue mise à part, toute idée ou pensée serait appréciée. –

Répondre

2

si vous utilisez un langage .NET, vous pourriez être en mesure d'accomplir ce que vous essayez de faire avec Microsoft's XML Diff and Patch outil/bibliothèque.Je l'ai utilisé pour identifier correctement qu'il y avait des changements entre différents fragments de xml. Cela était important pour notre scénario car le code XML que nous avions sur le disque serait différent après avoir été stocké dans une colonne XML Sql Server en raison de l'effacement des espaces insignifiants et/ou de la réorganisation des attributs (Infoset). Le simple fait de comparer les blobs de texte détecterait toujours une différence, alors qu'en réalité les XML éléments/valeurs étaient les mêmes.

Je n'ai pas utilisé la capacité de correction de l'outil, seulement XmlDiff.

Il existe plusieurs outils de diff XML commercial sur le marché, mais je ne connais pas ceux qui fournissent un code, ou script, API. Ce serait une fonctionnalité intéressante pour ajouter de la valeur!

+0

J'ai regardé d'autres outils Diff/Patch, je vais devoir jeter un oeil à celui-là. Ce concept de base était quelque chose à quoi je pensais. Prenez deux docs 5_0 et générez un patch à partir d'eux. Ensuite, prenez ce correctif et appliquez-le au document 5_1 pour créer le document 5_1 personnalisé. –

+0

si vous obtenez quelque chose qui fonctionne à votre goût, postez à ce sujet. J'aimerais entendre votre expérience avec ça. Bonne chance! –

+0

Le Diff Xml fonctionne très bien pour la comparaison, le seul problème est le DiffGram que je peux générer stocke une valeur de hachage pour le document d'origine. Je ne peux donc pas appliquer le correctif au nouveau document. En outre, il construit le correctif basé sur l'index des noeuds, donc je ne pouvais pas non plus l'appliquer manuellement à un nouveau document. Cet outil deviendra certainement utile à l'avenir, mais je ne pense pas que cela aidera dans cette situation. –

Questions connexes