Dokumentvergleich

Dokumentvergleich

Dieser Leitfaden zeigt, wie man zwei Textdurchläufe vergleicht und die Abfolge von Änderungen zwischen ihnen erzeugt, wobei die Aspose.PDF FOSS text-diff engine für .NET verwendet wird. Der Einstiegspunkt für dieses Vergleichsmodell ist DiffOperation, eine einzelne Bearbeitung, die mit einem Operation (Equal, Delete, oder Insert), zusammen mit dem DiffUtils Hilfsklasse zum Auffinden gemeinsamer Texte und zum Wiederzusammenfügen eines Diffs zurück in den Quell- und Zieltext. Ein separater Optimierungslauf, beschrieben in Diff-Optimierung, kanonisiert die auf diese Weise erzeugte rohe Diff-Ausgabe, bevor sie gerendert oder angewendet wird.


Das Diff-Modell: Operation und DiffOperation

Operation ist das Enum, das jede Änderung in einem Diff klassifiziert: Equal markiert einen Textabschnitt, der unverändert bleibt, Delete markiert einen Abschnitt, der aus der Quelle entfernt wurde, und Insert markiert einen Abschnitt, der im Ziel hinzugefügt wurde. DiffOperation verbindet einen Operation-Wert mit dem Text, auf den er angewendet wird, und implementiert IEquatable<DiffOperation>, sodass zwei Änderungen auf Gleichheit verglichen werden können.

using Aspose.Pdf.Comparison.Diff;

// A single edit consists of an Operation and the run of text it applies to.
var unchanged = new DiffOperation(Operation.Equal, "Aspose.PDF ");
var removed = new DiffOperation(Operation.Delete, "for .NET Framework");
var added = new DiffOperation(Operation.Insert, "FOSS for .NET");

Console.WriteLine(unchanged.Operation); // Equal
Console.WriteLine(added.Text);          // "FOSS for .NET"

Gemeinsamen Text lokalisieren mit DiffUtils

DiffUtils ist eine statische Hilfsklasse, die von der Diff-Engine verwendet wird, um das gemeinsame Präfix und Suffix zweier Zeichenketten zu finden, bevor der unterschiedliche Mittelteil diffiert wird. FindCommonStartParts ermittelt das gemeinsame Präfix, und FindCommonEndParts ermittelt das gemeinsame Suffix; eine Überladung von FindCommonEndParts akzeptiert ein startIndex, sodass die Suffixsuche auf Text begrenzt werden kann, der einem bereits gefundenen Präfix folgt.

string original = "The quick brown fox";
string revised = "The quick red fox jumps";

var commonStart = DiffUtils.FindCommonStartParts(original, revised);
var commonEnd = DiffUtils.FindCommonEndParts(original, revised);

Text aus einem Diff wieder zusammenbauen

Sobald ein Diff als eine Sequenz von DiffOperation-Werten ausgedrückt ist, kann DiffUtils beide Seiten des Vergleichs rekonstruieren: AssemblySourceText stellt den Originaltext aus den Equal- und Delete-Durchläufen wieder her, und AssemblyDestinationText stellt den überarbeiteten Text aus den Equal- und Insert-Durchläufen wieder her.

using System.Collections.Generic;

var diffs = new List<DiffOperation>
{
    new DiffOperation(Operation.Equal, "The quick "),
    new DiffOperation(Operation.Delete, "brown"),
    new DiffOperation(Operation.Insert, "red"),
    new DiffOperation(Operation.Equal, " fox")
};

string sourceText = DiffUtils.AssemblySourceText(diffs);
string destinationText = DiffUtils.AssemblyDestinationText(diffs);

Console.WriteLine(sourceText);      // "The quick brown fox"
Console.WriteLine(destinationText); // "The quick red fox"

Vergleich und Berichterstellung von Änderungen

DiffOperation überschreibt Equals, GetHashCode und ToString, sodass Änderungen auf Gleichheit verglichen oder ohne zusätzlichen Konvertierungscode in Logs und Testausgaben geschrieben werden können.

var a = new DiffOperation(Operation.Equal, "PDF");
var b = new DiffOperation(Operation.Equal, "PDF");

bool same = a.Equals(b); // true - same Operation and Text
Console.WriteLine(a.ToString());

Tipps und bewährte Vorgehensweisen

  • DiffOperation ist unveränderlich und implementiert IEquatable<DiffOperation> — verwende Equals, um zwei Änderungen zu vergleichen, anstatt Referenzgleichheit zu prüfen.
  • Finde zunächst das gemeinsame Präfix mit FindCommonStartParts, und übergebe dann seine Länge an die startIndex-Überladung von FindCommonEndParts, um zu vermeiden, dass ein kurzes gemeinsames Präfix doppelt als Teil des Suffixes gezählt wird.
  • Verwende AssemblySourceText und AssemblyDestinationText, um zu überprüfen, ob eine Sequenz von DiffOperation-Werten exakt zum ursprünglichen und überarbeiteten Text zurückkehrt, bevor du sie an anderer Stelle nutzt.
  • Behandle Operation.Equal-Durchläufe als No-Ops beim Rendern eines visuellen Diffs und hebe nur Delete- und Insert-Durchläufe hervor.
  • Diese Engine differenziert Text, nicht Dokumente direkt — extrahieren Sie den Text, den Sie vergleichen möchten (zum Beispiel von einer Seite oder einem Dokument), bevor Sie einen Diff erstellen.

Häufige Probleme

ProblemUrsacheBehebung
AssemblySourceText / AssemblyDestinationText Ausgabe stimmt nicht mit den Originalen übereinDie diffs-Liste ist unvollständig oder ihre DiffOperation-Einträge sind nicht in der richtigen ReihenfolgeFüge jede Bearbeitung in die Sequenz ein, in der ursprünglichen Reihenfolge, in der die Bearbeitungen auftraten
FindCommonEndParts liefert ein unerwartetes Ergebnis bei kurzen, ähnlichen ZeichenkettenDie Suche nach dem gemeinsamen Suffix überschneidet sich mit bereits von FindCommonStartParts erfasstem TextÜbergebe die von FindCommonStartParts zurückgegebene Länge als startIndex-Argument
Equals liefert false für Änderungen, die identisch aussehenDie Text-Werte unterscheiden sich durch Leerzeichen oder Groß-/KleinschreibungNormalisieren Sie den Text (Trimmen / Kleinschreibung), bevor Sie die DiffOperation-Werte erstellen, die Sie vergleichen möchten
Die Diff-Ausgabe wirkt verrauscht oder unnötig fragmentiertRoh-DiffOperation-Sequenzen sind noch nicht kanonisiertFühren Sie die Sequenz durch den Optimierungsschritt aus, der in beschrieben wird Diff-Optimierung

FAQ

Was vergleicht die Diff-Engine?

Sie vergleicht Textabschnitte und erzeugt eine Sequenz von DiffOperation-Werten, die die Änderungen beschreiben — unveränderter, gelöschter oder eingefügter Text — die nötig sind, um einen String in einen anderen zu verwandeln.

Welche Bearbeitungstypen unterstützt Operation?

Drei: Equal für unveränderten Text, Delete für aus der Quelle entfernten Text und Insert für im Ziel hinzugefügten Text.

Wie prüfe ich, ob zwei Änderungen identisch sind?

Rufen Sie Equals auf einer DiffOperation-Instanz auf oder vergleichen Sie deren Operation- und Text-Eigenschaften direkt.

Kann ich den Original- und überarbeiteten Text aus einem Diff bekommen?

Ja — übergeben Sie die Liste der DiffOperation-Werte an DiffUtils.AssemblySourceText für den Originaltext und an DiffUtils.AssemblyDestinationText für den überarbeiteten Text.

Behandelt diese Seite das Zusammenführen oder Aufräumen eines Diff?

Nein — das Kanonisieren eines Roh-Diffs (Zusammenführen benachbarter Abschnitte, Verschieben von Änderungen über Gleichheiten) wird separat behandelt in Diff-Optimierung.


API Reference Zusammenfassung

Klasse / MethodeBeschreibung
OperationEnum, das eine Änderung als Equal, Delete oder Insert klassifiziert
DiffOperationEine einzelne Änderung: ein Operation, das mit dem Text verknüpft ist, auf das es angewendet wird
DiffOperation.OperationDer Operation-Wert für diese Änderung
DiffOperation.TextDer Textabschnitt, auf den diese Bearbeitung angewendet wird
DiffOperation.EqualsVergleicht zwei Bearbeitungen auf Gleichheit anhand von Operation und Text
DiffOperation.ToStringRendert eine Bearbeitung als Zeichenkette für Protokollierung oder Anzeige
DiffUtilsStatische Hilfsklasse mit Text-Diff-Hilfsprogrammen
DiffUtils.FindCommonStartPartsFindet das gemeinsame Präfix zweier Zeichenketten
DiffUtils.FindCommonEndPartsFindet das gemeinsame Suffix zweier Zeichenketten, optional beginnend bei einem Index
DiffUtils.AssemblySourceTextSetzt den Originaltext aus einer Liste von DiffOperation-Werten wieder zusammen
DiffUtils.AssemblyDestinationTextSetzt den überarbeiteten Text aus einer Liste von DiffOperation-Werten wieder zusammen

Siehe auch

 Deutsch