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
DiffOperationis onveranderlijk en implementeertIEquatable<DiffOperation>— gebruikEqualsom twee bewerkingen te vergelijken in plaats van referentie-gelijkheid.- Zoek eerst het gemeenschappelijke voorvoegsel met
FindCommonStartParts, en geef vervolgens de lengte ervan door aan destartIndexoverload vanFindCommonEndPartsom te voorkomen dat een kort gemeenschappelijk voorvoegsel dubbel wordt geteld als onderdeel van het achtervoegsel. - Gebruik
AssemblySourceTextenAssemblyDestinationTextom te verifiëren dat een reeksDiffOperationwaarden round-trips naar de exacte originele en herziene tekst voordat je er elders op vertrouwt. - Behandel
Operation.Equalruns als no-ops bij het renderen van een visuele diff, en markeer alleenDeleteenInsertruns. - 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
| Issue | Oorzaak | Oplossing |
|---|---|---|
AssemblySourceText / AssemblyDestinationText output komt niet overeen met de originelen | De diffs lijst is onvolledig of de DiffOperation items staan niet in de juiste volgorde | Neem elke bewerking op in de reeks, in de oorspronkelijke volgorde waarin de bewerkingen plaatsvonden |
FindCommonEndParts geeft een onverwacht resultaat bij korte, vergelijkbare strings | De gemeenschappelijke suffix-zoekopdracht overlapt tekst die al door FindCommonStartParts is gematcht | Geef de door FindCommonStartParts geretourneerde lengte door als het startIndex argument |
Equals retourneert false voor bewerkingen die identiek lijken | De Text waarden verschillen in witruimte of hoofdlettergebruik | Normaliseer tekst (trim / case-fold) voordat je DiffOperation waarden maakt die je wilt vergelijken |
| Diff-output ziet er ruisachtig of onnodig gefragmenteerd uit | Ruwe DiffOperation sequenties zijn nog niet gecanoniseerd | Voer 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 / Methode | Beschrijving |
|---|---|
Operation | Enum die een bewerking classificeert als Equal, Delete of Insert |
DiffOperation | Een enkele bewerking: een Operation gekoppeld aan de Text waarop deze van toepassing is |
DiffOperation.Operation | De Operation-waarde voor deze bewerking |
DiffOperation.Text | De doorlopende tekst waarop deze bewerking van toepassing is |
DiffOperation.Equals | Vergelijkt twee bewerkingen op gelijkheid met Operation en Text |
DiffOperation.ToString | Rendert een bewerking als een string voor logboekregistratie of weergave |
DiffUtils | Statische hulpklasse met tekst-diff hulpmiddelen |
DiffUtils.FindCommonStartParts | Vindt het gemeenschappelijke voorvoegsel dat twee strings delen |
DiffUtils.FindCommonEndParts | Vindt het gemeenschappelijke achtervoegsel dat twee strings delen, optioneel beginnend vanaf een index |
DiffUtils.AssemblySourceText | Stelt de originele tekst weer samen uit een lijst van DiffOperation-waarden |
DiffUtils.AssemblyDestinationText | Stelt de herziene tekst weer samen uit een lijst van DiffOperation-waarden |