Confronto di documenti
Confronto di Documenti
Questa guida mostra come confrontare due versioni di testo e produrre la sequenza di modifiche tra di esse usando il motore di diff di testo FOSS Aspose.PDF per .NET. Il punto di ingresso per questo modello di confronto è DiffOperation, una singola modifica etichettata con una Operation (Equal, Delete, o Insert), insieme alla DiffUtils classe di supporto per individuare il testo comune e ricomporre un diff nei suoi testi di origine e destinazione. Un passaggio di ottimizzazione separato, descritto in Ottimizzazione del Diff, canonicalizza l’output raw del diff prodotto in questo modo prima che venga renderizzato o applicato.
Il Modello di Diff: Operazione e DiffOperation
Operation è l’enumerazione che classifica ogni modifica in un diff: Equal indica una sequenza di testo invariata, Delete indica una sequenza rimossa dalla sorgente, e Insert indica una sequenza aggiunta nella destinazione. DiffOperation associa un valore Operation al Text a cui si applica, e implementa IEquatable<DiffOperation> in modo che due modifiche possano essere confrontate per uguaglianza.
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"Individuazione del Testo Comune con DiffUtils
DiffUtils è una classe di supporto statica utilizzata dal motore di diff per trovare il prefisso e il suffisso comuni condivisi da due stringhe prima che la sezione intermedia differente venga diffata. FindCommonStartParts individua il prefisso comune, e FindCommonEndParts individua il suffisso comune; un overload di FindCommonEndParts accetta un startIndex così la ricerca del suffisso può essere limitata al testo che segue un prefisso già individuato.
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);Ricostruzione del Testo da un Diff
Una volta che un diff è espresso come una sequenza di valori DiffOperation, DiffUtils può ricostruire entrambi i lati del confronto: AssemblySourceText ricostruisce il testo originale dai Equal e Delete runs, e AssemblyDestinationText ricostruisce il testo revisionato dai Equal e 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"Confrontare e segnalare le modifiche
DiffOperation sovrascrive Equals, GetHashCode e ToString, quindi le modifiche possono essere confrontate per uguaglianza o scritte nei log e nell’output dei test senza codice di conversione aggiuntivo.
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());Suggerimenti e migliori pratiche
DiffOperationè immutabile e implementaIEquatable<DiffOperation>— usaEqualsper confrontare due modifiche invece dell’uguaglianza di riferimento.- Individua prima il prefisso comune con
FindCommonStartParts, quindi passa la sua lunghezza alla sovraccaricostartIndexdiFindCommonEndPartsper evitare che un prefisso comune breve venga contato due volte come parte del suffisso. - Usa
AssemblySourceTexteAssemblyDestinationTextper verificare che una sequenza di valoriDiffOperationtorni esattamente al testo originale e revisionato prima di fare affidamento su di essa altrove. - Considera i run
Operation.Equalcome operazioni nulle durante il rendering di un diff visivo, e evidenzia solo i runDeleteeInsert. - Questo motore confronta diff di testo, non i documenti direttamente — estrai il testo che desideri confrontare (ad esempio, da una pagina o da un documento) prima di generare un diff.
Problemi comuni
| Problema | Causa | Correzione |
|---|---|---|
AssemblySourceText / AssemblyDestinationText l’output non corrisponde agli originali | L’elenco diffs è incompleto o le sue voci DiffOperation sono fuori ordine | Includi ogni modifica nella sequenza, nell’ordine originale in cui le modifiche si sono verificate |
FindCommonEndParts restituisce un risultato inaspettato su stringhe brevi e simili | La ricerca del suffisso comune si sovrappone al testo già corrisposto da FindCommonStartParts | Passa la lunghezza restituita da FindCommonStartParts come argomento startIndex |
Equals restituisce false per modifiche che sembrano identiche | I valori Text differiscono per spazi bianchi o maiuscole/minuscole | Normalizza il testo (rimuovi spazi / uniforma il case) prima di costruire i valori DiffOperation che intendi confrontare |
| L’output del diff appare rumoroso o inutilmente frammentato | Le sequenze grezze di DiffOperation non sono ancora canonicalizzate | Esegui la sequenza attraverso il passaggio di ottimizzazione descritto in Ottimizzazione del Diff |
FAQ
Cosa confronta il motore Diff?
Confronta sequenze di testo e produce una sequenza di valori DiffOperation che descrivono le modifiche — testo invariato, eliminato o inserito — necessarie per trasformare una stringa nell’altra.
Quali tipi di modifica supporta Operation?
Tre: Equal per testo invariato, Delete per testo rimosso dalla sorgente e Insert per testo aggiunto nella destinazione.
Come posso verificare se due modifiche sono identiche?
Chiama Equals su un’istanza DiffOperation, oppure confronta direttamente le sue proprietà Operation e Text.
Posso recuperare il testo originale e quello revisionato da un diff?
Sì — passa l’elenco dei valori DiffOperation a DiffUtils.AssemblySourceText per il testo originale e DiffUtils.AssemblyDestinationText per il testo revisionato.
Questa pagina tratta l’unione o la pulizia di un diff?
No — la canonicalizzazione di un diff grezzo (unione di blocchi adiacenti, scorrimento delle modifiche attraverso le uguaglianze) è trattata separatamente in Ottimizzazione del Diff.
API Reference Riepilogo
| Classe / Metodo | Descrizione |
|---|---|
Operation | Enum che classifica una modifica come Equal, Delete o Insert |
DiffOperation | Una singola modifica: un Operation accoppiato al Text a cui si applica |
DiffOperation.Operation | Il valore Operation per questa modifica |
DiffOperation.Text | Il blocco di testo a cui si applica questa modifica |
DiffOperation.Equals | Confronta due modifiche per uguaglianza tramite Operation e Text |
DiffOperation.ToString | Rende una modifica come stringa per il logging o la visualizzazione |
DiffUtils | Classe di supporto statica con utility per il diff di testo |
DiffUtils.FindCommonStartParts | Trova il prefisso comune condiviso da due stringhe |
DiffUtils.FindCommonEndParts | Trova il suffisso comune condiviso da due stringhe, opzionalmente a partire da un indice |
DiffUtils.AssemblySourceText | Ricompone il testo originale da un elenco di valori DiffOperation |
DiffUtils.AssemblyDestinationText | Ricompone il testo revisionato da un elenco di valori DiffOperation |