Dokumentjämförelse
Dokumentjämförelse
Den här guiden visar hur man jämför två textkörningar och producerar sekvensen av redigeringar mellan dem med hjälp av Aspose.PDF FOSS text-diff-motorn för .NET. Ingångspunkten för denna jämförelsemodell är DiffOperation, en enda redigering märkt med en Operation (Equal, Delete, eller Insert), tillsammans med DiffUtils hjälparklass för att lokalisera gemensam text och återmontera en diff tillbaka till dess käll- och måltext. Ett separat optimeringspass, beskrivet i Diffoptimering, kanoniserar rå diff-output som produceras på detta sätt innan den renderas eller appliceras.
Diffmodellen: Operation och DiffOperation
Operation är enumen som klassificerar varje redigering i en diff: Equal markerar ett textavsnitt som är oförändrat, Delete markerar ett avsnitt som tagits bort från källan, och Insert markerar ett avsnitt som lagts till i destinationen. DiffOperation parar ihop ett Operation-värde med den Text det gäller, och implementerar IEquatable<DiffOperation> så att två redigeringar kan jämföras för likhet.
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"Lokalisering av gemensam text med DiffUtils
DiffUtils är en statisk hjälparklass som används av diff-motorn för att hitta det gemensamma prefixet och suffixet som delas av två strängar innan den skiljande mellersta delen diffas. FindCommonStartParts lokaliserar det gemensamma prefixet, och FindCommonEndParts lokaliserar det gemensamma suffixet; en överlagring av FindCommonEndParts accepterar ett startIndex så att suffixsökningen kan begränsas till text som följer ett redan lokaliserat prefix.
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);Återmontera text från en diff
När en diff uttrycks som en sekvens av DiffOperation-värden kan DiffUtils rekonstruera båda sidor av jämförelsen: AssemblySourceText bygger om den ursprungliga texten från Equal- och Delete-körningar, och AssemblyDestinationText bygger om den reviderade texten från Equal- och Insert-körningar.
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"Jämföra och rapportera redigeringar
DiffOperation åsidosätter Equals, GetHashCode och ToString, så att redigeringar kan jämföras för likhet eller skrivas till loggar och testutdata utan extra konverteringskod.
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());Tips och bästa praxis
DiffOperationär oföränderlig och implementerarIEquatable<DiffOperation>— användEqualsför att jämföra två redigeringar snarare än referenslikhet.- Lokalisera det gemensamma prefixet med
FindCommonStartPartsförst, skicka sedan dess längd tillstartIndex-överladdningen avFindCommonEndPartsför att undvika att ett kort gemensamt prefix räknas dubbelt som en del av suffixet. - Använd
AssemblySourceTextochAssemblyDestinationTextför att verifiera att en sekvens avDiffOperation-värden gör en fullständig återgång till exakt original- och reviderad text innan du förlitar dig på den någon annanstans. - Behandla
Operation.Equal-körningar som inga operationer när du renderar en visuell diff, och markera endastDelete- ochInsert-körningar. - Den här motorn jämför text, inte dokument direkt — extrahera den text du vill jämföra (till exempel från en sida eller ett dokument) innan du bygger en diff.
Vanliga problem
| Problem | Orsak | Fix |
|---|---|---|
AssemblySourceText / AssemblyDestinationText utdata matchar inte originalen | Listan diffs är ofullständig eller dess DiffOperation poster är i fel ordning | Inkludera varje redigering i sekvensen, i den ursprungliga ordning som redigeringarna skedde |
FindCommonEndParts returnerar ett oväntat resultat på korta, liknande strängar | Den gemensamma suffixsökningen överlappar text som redan matchats av FindCommonStartParts | Skicka längden som returneras av FindCommonStartParts som argumentet startIndex |
Equals returnerar false för redigeringar som ser identiska ut | Värdena för Text skiljer sig åt med mellanslag eller skiftläge | Normalisera text (trimma / case-fold) innan du konstruerar DiffOperation-värden som du avser att jämföra |
| Diff-resultatet ser brusigt eller onödigt fragmenterat ut | Råa DiffOperation-sekvenser är ännu inte kanoniserade | Kör sekvensen genom optimeringssteget som beskrivs i Diff-optimering |
FAQ
Vad jämför Diff-motorn?
Den jämför textsekvenser och producerar en sekvens av DiffOperation-värden som beskriver redigeringarna — oförändrad, raderad eller insatt text — som behövs för att omvandla en sträng till en annan.
Vilka redigeringstyper stöder Operation?
Tre: Equal för oförändrad text, Delete för text som tagits bort från källan, och Insert för text som lagts till i målet.
Hur kontrollerar jag om två redigeringar är desamma?
Anropa Equals på en DiffOperation-instans, eller jämför dess Operation och Text egenskaper direkt.
Kan jag få tillbaka den ursprungliga och reviderade texten från en diff?
Ja — skicka listan med DiffOperation-värden till DiffUtils.AssemblySourceText för den ursprungliga texten och DiffUtils.AssemblyDestinationText för den reviderade texten.
Täcker den här sidan sammanslagning eller rensning av en diff?
Nej — kanonisering av en rå diff (sammanfoga intilliggande körningar, glida redigeringar över likheter) behandlas separat i Diff-optimering.
API Reference Sammanfattning
| Klass / Metod | Beskrivning |
|---|---|
Operation | Enum som klassificerar en redigering som Equal, Delete eller Insert |
DiffOperation | En enskild redigering: en Operation ihopparad med den Text den gäller för |
DiffOperation.Operation | Värdet Operation för den här redigeringen |
DiffOperation.Text | Texten som den här redigeringen gäller för |
DiffOperation.Equals | Jämför två redigeringar för likhet med Operation och Text |
DiffOperation.ToString | Renderar en redigering som en sträng för loggning eller visning |
DiffUtils | Statisk hjälparklass med verktyg för text-diffning |
DiffUtils.FindCommonStartParts | Hittar det gemensamma prefix som två strängar delar |
DiffUtils.FindCommonEndParts | Hittar det gemensamma suffix som två strängar delar, valfritt med start från ett index |
DiffUtils.AssemblySourceText | Sätter ihop den ursprungliga texten från en lista med DiffOperation-värden |
DiffUtils.AssemblyDestinationText | Sätter ihop den reviderade texten från en lista med DiffOperation-värden |