Frage

Ich habe eine Anwendung, die Dokumente (man denke Word-Dokumente) speichert in einem XML-basierten Format - Zur Zeit C # Klassen generiert aus XSD-Dateien werden zum Lesen / das Dokumentformat zu schreiben und alles war gut, bis vor kurzem, als ich eine Änderung vornehmen musste das Format des Dokuments. Meine Sorge ist, mit Abwärtskompatibilität als zukünftige Versionen meiner Anwendung Notwendigkeit der Lage sein, Dokumente, die von allen früheren Versionen gespeichert lesen und im Idealfall möchte ich auch ältere Versionen meiner App anmutig in der Lage sein zu handhaben Dokumente gespeichert Lesen von zukünftigen Versionen von meiner app.

Zum Beispiel Angenommen ich das Schema meines Dokuments ändern, um ein (optional) zusätzliches Element irgendwo hinzuzufügen, dann ältere Versionen meiner Anwendung werden einfach ignorieren die zusätzlichen elemnt und es werden keine Probleme geben:

<doc>
    <!-- Existing document -->
    <myElement>Hello World!</myElement>
</doc>

Allerdings, wenn eine Bruch Änderung vorgenommen wird (ein Attribut in ein Element zum Beispiel geändert, oder eine Sammlung von Elementen), dann vorbei an Versionen meiner App sollten entweder dieses Element ignorieren, wenn es optional ist, oder den Benutzer darüber informieren, dass sie versuchen, ein Dokument mit einer neueren Version meiner App sonst gespeichert zu lesen. Auch dies zur Zeit macht mir Kopfschmerzen wie alle zukünftigen Versionen meiner app völlig separater Code benötigen zum Lesen der zwei verschiedene Dokumente benötigt wird.

Ein Beispiel für eine solche Änderung wäre die folgende xml:

<doc>
    <!-- Existing document -->
    <someElement contents="12" />
</doc>

Der Wechsel zu:

<doc>
    <!-- Existing document -->
    <someElement>
        <contents>12</contents>
        <contents>13</contents>
    </someElement>
</doc>

Um Unterstützung Kopfschmerzen in der Zukunft zu verhindern ich mit einer guten Strategie für den Umgang mit Veränderungen kommen wollte ich in Zukunft machen könnte, so dass Versionen meiner Anwendung, die ich jetzt freisetzen, werden in der Lage sein mit diesem fertig zu werden Veränderungen in der Zukunft:

  • Sollte die „Versionsnummer“ des Dokuments im Dokument selbst gespeichert werden, und wenn ja, welche Versionierungsstrategie verwendet werden soll? Sollte die Dokumentversion die EXE-Assemblierung-Version übereinstimmen, oder sollte eine komplexere Strategie verwendet wird (zum Beispiel größere Revision zeigt Bruch Änderungen geändert, wheras kleine Revision Schritte zeigen non-breaking Änderungen - zum Beispiel zusätzliche optionale Elementen)
  • Welche Methode soll ich das Dokument selbst zu lesen und wie vermeide ich große Mengen an Code für verschiedene Versionen von Dokumenten zu replizieren?
    • Obwohl XPath offensichtlich flexibelsten ist, ist es viel mehr Arbeit ist einfach zu implementieren als Klassen mit XSD erzeugen.
    • Auf der anderen Seite, wenn DOM-Parsing dann wäre eine neue Kopie des Dokuments verwendet wird xsd in der Quellcodeverwaltung für jede Bruchänderung benötigt werden, was zu Problemen, wenn Korrekturen immer auf ältere Schemata (alte Versionen der App angewendet werden müssen, sind noch nicht unterstützt).

Außerdem habe ich all dies sehr loosly auf der Annahme gearbeitet, dass alle Änderungen, die ich können in diese beiden Kategorien von „Schnabelkupieren changes“ aufgeteilt machen und „non-breaking changes“, aber ich bin nicht ganz überzeugt, dass dies eine sichere Annahme zu machen.

Beachten Sie, dass ich den Begriff „Dokument“ sehr lose verwendet werden - der Inhalt überhaupt ein Dokument ähnelt nicht

!

Vielen Dank für jede Beratung, die Sie mir anbieten kann.

War es hilfreich?

Lösung

Sie müssen auf jeden Fall eine Versionsnummer in der XML-Datei, und ich würde vorschlagen, nicht an die Version der Anwendung zu binden, weil es wirklich eine separate Einheit ist. Sie können ohne ständig wechselnden das XML-Format zwei oder drei Versionen Ihrer App durch, oder Sie können das Format mehrmals während der Entwicklung eines Single-Auskopplung aufzuwickeln ändern.

Wenn Sie ältere Versionen der Anwendung in der Lage sein, neuere Versionen der XML-Datei zu lesen, dann können Sie nie, nie Elemente entfernen oder ändern ihre Namen. Sie können jederzeit Elemente hinzufügen und der ältere Code wird sie glücklich ignorieren (eine der netten Features von XML), aber wenn man sie dann dem alten Code entfernen wird nicht funktionieren Lage sein.

Wie Ismael sagte, XSLT ist ein guter Weg, um das XML-Format von einer Version zur anderen zu konvertieren, so dass Sie mit einem ganzen Haufen von Parsing-Routinen nicht in Ihrem Quellcode aufzuwickeln.

Andere Tipps

XSLT ist eine offensichtliche Wahl hier. Vorausgesetzt, dass Sie die Version Ihres Dokuments identifizieren können, für jede Version Ihres Schemas, creat eine XSLT, die die vorherige Version auf die neue Version transformiert.

Sie können die Transformationen nacheinander anwenden, bis Sie die aktuelle Version erreichen. So bearbeiten Sie immer nur die neueste Version des Dokuments. Natürlich können Sie nicht zum alten Format speichern und das Dokument für ältere Versionen brechen können, aber das ist typisch für viele Anwendungen. Wenn Sie unbedingt auf die alte Version speichern müssen, erstellen Sie einfach eine Transformation, die in die andere Richtung geht.

Wie @Andy sagt, verwenden Sie die wichtigsten Build-Nummer Ihrer Anwendung.

Könnten Sie ein Attribut mit der Root-Elemente Angabe Version hinzufügen?

Auf diese Weise ältere Versionen werden nicht gebrochen werden, und neuere Versionen Ihrer Software werden das Attribut sehen und entsprechend zu einem anderen Ladeverfahren wechseln.

Versionsnummerierung selbst würde auf Ihrer Häufigkeit der Veröffentlichung ab. Ich persönlich würde mit der großen Build-Nummer von der Software gehen, es sei denn, Sie das Format zu ändern häufigen voraussehen als das.

Bearbeiten : habe gerade bemerkt, die etwas über Code-Duplizierung:

Für das ich die Fabrik Muster verwenden würde, so etwas wie folgt aus:

LoadDocument
DoNonVersionDependingLoading
VersionSpecificLoaderFactory(VersionNumber)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top