Documentvergelijking

Documentvergelijking

Deze gids laat zien hoe je twee tekstruns kunt vergelijken en de reeks bewerkingen tussen hen kunt produceren met behulp van de Aspose.PDF FOSS-tekstdiff-engine voor .NET. Het ingangspunt voor dit vergelijkingsmodel is DiffOperation, een enkele bewerking gemarkeerd met een Operation (Equal, Delete, of Insert), samen met de DiffUtils helper class voor het lokaliseren van gemeenschappelijke tekst en het opnieuw samenstellen van een diff terug in de bron- en bestemmingstekst. Een aparte optimalisatiepass, beschreven in Diff Optimalisatie, canoniseert ruwe diff-uitvoer die op deze manier is geproduceerd voordat deze wordt gerenderd of toegepast.


Het Diff-model: Operatie en DiffOperation

Operation is de enum die elke bewerking in een diff classificeert: Equal markeert een reeks tekst die ongewijzigd is, Delete markeert een reeks die uit de bron is verwijderd, en Insert markeert een reeks die aan de bestemming is toegevoegd. DiffOperation koppelt een Operation waarde aan de Text waarop deze van toepassing is, en implementeert IEquatable<DiffOperation> zodat twee bewerkingen op gelijkheid kunnen worden vergeleken.

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"

Gemeenschappelijke tekst lokaliseren met DiffUtils

DiffUtils is een statische hulpprogrammaklasse die door de diff-engine wordt gebruikt om het gemeenschappelijke voorvoegsel en achtervoegsel dat twee strings delen te vinden voordat het afwijkende middengedeelte wordt gediffed. FindCommonStartParts vindt het gemeenschappelijke voorvoegsel, en FindCommonEndParts vindt het gemeenschappelijke achtervoegsel; een overload van FindCommonEndParts accepteert een startIndex zodat de achtervoegsel-zoekopdracht begrensd kan worden tot tekst die volgt op een reeds gevonden voorvoegsel.

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);

Tekst opnieuw samenstellen vanuit een diff

Zodra een diff is uitgedrukt als een reeks DiffOperation waarden, kan DiffUtils beide zijden van de vergelijking reconstrueren: AssemblySourceText bouwt de originele tekst opnieuw op vanuit de Equal en Delete runs, en AssemblyDestinationText bouwt de herziene tekst opnieuw op vanuit de Equal en Insert runs.

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"

Vergelijken en rapporteren van bewerkingen

DiffOperation overschrijft Equals, GetHashCode en ToString, zodat bewerkingen kunnen worden vergeleken op gelijkheid of geschreven naar logs en testoutput zonder extra conversiecode.

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 en beste praktijken

  • DiffOperation is onveranderlijk en implementeert IEquatable<DiffOperation> — gebruik Equals om twee bewerkingen te vergelijken in plaats van referentie-gelijkheid.
  • Zoek eerst het gemeenschappelijke voorvoegsel met FindCommonStartParts, en geef vervolgens de lengte ervan door aan de startIndex overload van FindCommonEndParts om te voorkomen dat een kort gemeenschappelijk voorvoegsel dubbel wordt geteld als onderdeel van het achtervoegsel.
  • Gebruik AssemblySourceText en AssemblyDestinationText om te verifiëren dat een reeks DiffOperation waarden round-trips naar de exacte originele en herziene tekst voordat je er elders op vertrouwt.
  • Behandel Operation.Equal runs als no-ops bij het renderen van een visuele diff, en markeer alleen Delete en Insert runs.
  • Deze engine vergelijkt tekst, niet direct documenten — haal de tekst die je wilt vergelijken (bijvoorbeeld van een pagina of document) eerst op voordat je een diff maakt.

Veelvoorkomende problemen

IssueOorzaakOplossing
AssemblySourceText / AssemblyDestinationText output komt niet overeen met de originelenDe diffs lijst is onvolledig of de DiffOperation items staan niet in de juiste volgordeNeem elke bewerking op in de reeks, in de oorspronkelijke volgorde waarin de bewerkingen plaatsvonden
FindCommonEndParts geeft een onverwacht resultaat bij korte, vergelijkbare stringsDe gemeenschappelijke suffix-zoekopdracht overlapt tekst die al door FindCommonStartParts is gematchtGeef de door FindCommonStartParts geretourneerde lengte door als het startIndex argument
Equals retourneert false voor bewerkingen die identiek lijkenDe Text waarden verschillen in witruimte of hoofdlettergebruikNormaliseer tekst (trim / case-fold) voordat je DiffOperation waarden maakt die je wilt vergelijken
Diff-output ziet er ruisachtig of onnodig gefragmenteerd uitRuwe DiffOperation sequenties zijn nog niet gecanoniseerdVoer de sequentie door de optimalisatie-passage beschreven in Diff-optimalisatie

FAQ

Wat vergelijkt de Diff engine?

Het vergelijkt opeenvolgende stukken tekst en produceert een reeks DiffOperation waarden die de bewerkingen beschrijven — onveranderde, verwijderde of ingevoegde tekst — die nodig zijn om de ene tekenreeks in de andere om te zetten.

Welke bewerkingstypen ondersteunt Operation?

Drie: Equal voor onveranderde tekst, Delete voor tekst die uit de bron is verwijderd, en Insert voor tekst die aan de bestemming is toegevoegd.

Hoe controleer ik of twee bewerkingen hetzelfde zijn?

Roep Equals aan op een DiffOperation instantie, of vergelijk direct de Operation en Text eigenschappen.

Kan ik de originele en herziene tekst terugkrijgen uit een diff?

Ja — geef de lijst met DiffOperation-waarden door aan DiffUtils.AssemblySourceText voor de originele tekst en DiffUtils.AssemblyDestinationText voor de herziene tekst.

Behandelt deze pagina het samenvoegen of opschonen van een diff?

Nee — het canoniseren van een ruwe diff (aangrenzende runs samenvoegen, bewerkingen schuiven over gelijkheden) wordt apart behandeld in Diff-optimalisatie.


API Reference Samenvatting

Klasse / MethodeBeschrijving
OperationEnum die een bewerking classificeert als Equal, Delete of Insert
DiffOperationEen enkele bewerking: een Operation gekoppeld aan de Text waarop deze van toepassing is
DiffOperation.OperationDe Operation-waarde voor deze bewerking
DiffOperation.TextDe doorlopende tekst waarop deze bewerking van toepassing is
DiffOperation.EqualsVergelijkt twee bewerkingen op gelijkheid met Operation en Text
DiffOperation.ToStringRendert een bewerking als een string voor logboekregistratie of weergave
DiffUtilsStatische hulpklasse met tekst-diff hulpmiddelen
DiffUtils.FindCommonStartPartsVindt het gemeenschappelijke voorvoegsel dat twee strings delen
DiffUtils.FindCommonEndPartsVindt het gemeenschappelijke achtervoegsel dat twee strings delen, optioneel beginnend vanaf een index
DiffUtils.AssemblySourceTextStelt de originele tekst weer samen uit een lijst van DiffOperation-waarden
DiffUtils.AssemblyDestinationTextStelt de herziene tekst weer samen uit een lijst van DiffOperation-waarden

Zie ook

 Nederlands