Compararea documentelor
Comparare Documente
Acest ghid arată cum să compari două seturi de text și să producă secvența de editări dintre ele utilizând motorul FOSS de difuzare a textului Aspose.PDF pentru .NET. Punctul de intrare pentru acest model de comparare este DiffOperation, o singură editare etichetată cu un Operation (Equal, Delete, sau Insert), împreună cu DiffUtils clasă auxiliară pentru localizarea textului comun și reasamblarea unui diff înapoi în textul său sursă și destinație. O trecere separată de optimizare, descrisă în Optimizarea Diff, canonicalizează ieșirea brută a diff-ului produsă în acest mod înainte de a fi redată sau aplicată.
Modelul Diff: Operație și DiffOperation
Operation este enumerația care clasifică fiecare editare într-un diff: Equal marchează o secvență de text neschimbată, Delete marchează o secvență eliminată din sursă, iar Insert marchează o secvență adăugată în destinație. DiffOperation asociază o valoare Operation cu Text la care se aplică și implementează IEquatable<DiffOperation> astfel încât două editări să poată fi comparate pentru egalitate.
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"Localizarea Textului Comun cu DiffUtils
DiffUtils este o clasă statică de ajutor utilizată de motorul de diff pentru a găsi prefixul și sufixul comun împărțit de două șiruri înainte ca secțiunea intermediară diferită să fie comparată. FindCommonStartParts localizează prefixul comun, iar FindCommonEndParts localizează sufixul comun; o suprasarcină a FindCommonEndParts acceptă un startIndex astfel încât căutarea sufixului să poată fi limitată la textul care urmează unui prefix deja localizat.
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);Reasamblarea Textului dintr-un Diff
Odată ce o diferență este exprimată ca o secvență de valori DiffOperation, DiffUtils poate reconstrui oricare dintre părțile comparației: AssemblySourceText reconstruiște textul original din execuțiile Equal și Delete, iar AssemblyDestinationText reconstruiște textul revizuit din execuțiile Equal și Insert.
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"Compararea și raportarea editărilor
DiffOperation suprascrie Equals, GetHashCode și ToString, astfel încât editările pot fi comparate pentru egalitate sau scrise în jurnale și ieșiri de test fără cod suplimentar de conversie.
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());Sfaturi și cele mai bune practici
DiffOperationeste imuabil și implementeazăIEquatable<DiffOperation>— foloseșteEqualspentru a compara două editări în loc de egalitatea de referință.- Localizează prefixul comun cu
FindCommonStartPartsmai întâi, apoi transmite lungimea acestuia în suprasarcinastartIndexa luiFindCommonEndPartspentru a evita ca un prefix comun scurt să fie numărat de două ori ca parte a sufixului. - Folosește
AssemblySourceTextșiAssemblyDestinationTextpentru a verifica că o secvență de valoriDiffOperationrevine exact la textul original și revizuit înainte de a te baza pe ea în altă parte. - Tratează rulările
Operation.Equalca operații fără efect atunci când redai o diferență vizuală și evidențiază doar rulărileDeleteșiInsert. - Acest motor compară diferențele de text, nu documentele direct — extrage textul pe care vrei să îl compari (de exemplu, dintr-o pagină sau document) înainte de a genera o diferență.
Probleme comune
| Problemă | Cauză | Remediere |
|---|---|---|
Ieșirea AssemblySourceText / AssemblyDestinationText nu se potrivește cu originalele | Lista diffs este incompletă sau intrările sale DiffOperation sunt în afara ordinii | Includeți fiecare modificare în secvență, în ordinea originală în care au avut loc modificările |
FindCommonEndParts returnează un rezultat neașteptat pe șiruri scurte și similare | Căutarea sufixului comun suprapune textul deja potrivit de FindCommonStartParts | Transmiteți lungimea returnată de FindCommonStartParts ca argument startIndex |
Equals returnează false pentru editări care par identice | Valorile Text diferă prin spații albe sau prin majuscule/minuscule | Normalizați textul (trim / case-fold) înainte de a construi valorile DiffOperation pe care intenționați să le comparați |
| Ieșirea diff pare zgomotoasă sau inutil fragmentată | Secvențele brute DiffOperation nu sunt încă canonicalizate | Rulați secvența prin trecerea de optimizare descrisă în Optimizarea Diff |
FAQ
Ce compară motorul Diff?
Compară secvențe de text și produce o succesiune de valori DiffOperation care descriu editările — text neschimbat, șters sau inserat — necesare pentru a transforma un șir în altul.
Ce tipuri de editări suportă Operation?
Trei: Equal pentru text neschimbat, Delete pentru text eliminat din sursă și Insert pentru text adăugat în destinație.
Cum verific dacă două editări sunt identice?
Apelați Equals pe o instanță DiffOperation, sau comparați direct proprietățile Operation și Text ale acesteia.
Pot să recuperez textul original și revizuit dintr-un diff?
Da — transmiteți lista de valori DiffOperation către DiffUtils.AssemblySourceText pentru textul original și DiffUtils.AssemblyDestinationText pentru textul revizuit.
Această pagină acoperă îmbinarea sau curățarea unui diff?
Nu — canonicalizarea unui diff brut (îmbinarea secvențelor adiacente, alunecarea editărilor peste egalități) este acoperită separat în Optimizare Diff.
API Reference Rezumat
| Clasă / Metodă | Descriere: |
|---|---|
Operation | Enum care clasifică o editare ca Equal, Delete sau Insert |
DiffOperation | O singură editare: un Operation asociat cu Text la care se aplică |
DiffOperation.Operation | Valoarea Operation pentru această editare |
DiffOperation.Text | Secvența de text la care se aplică această editare |
DiffOperation.Equals | Compară două editări pentru egalitate după Operation și Text |
DiffOperation.ToString | Redă o editare ca șir pentru jurnalizare sau afișare |
DiffUtils | Clasă statică de ajutor cu utilități pentru diferențierea textului |
DiffUtils.FindCommonStartParts | Găsește prefixul comun al două șiruri |
DiffUtils.FindCommonEndParts | Găsește sufixul comun al două șiruri, opțional începând de la un index |
DiffUtils.AssemblySourceText | Reconstruiește textul original dintr-o listă de valori DiffOperation |
DiffUtils.AssemblyDestinationText | Reasamblează textul revizuit dintr-o listă de valori DiffOperation |