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 implementa IEquatable<DiffOperation> — usa Equals per confrontare due modifiche invece dell’uguaglianza di riferimento.
  • Individua prima il prefisso comune con FindCommonStartParts, quindi passa la sua lunghezza alla sovraccarico startIndex di FindCommonEndParts per evitare che un prefisso comune breve venga contato due volte come parte del suffisso.
  • Usa AssemblySourceText e AssemblyDestinationText per verificare che una sequenza di valori DiffOperation torni esattamente al testo originale e revisionato prima di fare affidamento su di essa altrove.
  • Considera i run Operation.Equal come operazioni nulle durante il rendering di un diff visivo, e evidenzia solo i run Delete e Insert.
  • 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

ProblemaCausaCorrezione
AssemblySourceText / AssemblyDestinationText l’output non corrisponde agli originaliL’elenco diffs è incompleto o le sue voci DiffOperation sono fuori ordineIncludi ogni modifica nella sequenza, nell’ordine originale in cui le modifiche si sono verificate
FindCommonEndParts restituisce un risultato inaspettato su stringhe brevi e similiLa ricerca del suffisso comune si sovrappone al testo già corrisposto da FindCommonStartPartsPassa la lunghezza restituita da FindCommonStartParts come argomento startIndex
Equals restituisce false per modifiche che sembrano identicheI valori Text differiscono per spazi bianchi o maiuscole/minuscoleNormalizza il testo (rimuovi spazi / uniforma il case) prima di costruire i valori DiffOperation che intendi confrontare
L’output del diff appare rumoroso o inutilmente frammentatoLe sequenze grezze di DiffOperation non sono ancora canonicalizzateEsegui 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 / MetodoDescrizione
OperationEnum che classifica una modifica come Equal, Delete o Insert
DiffOperationUna singola modifica: un Operation accoppiato al Text a cui si applica
DiffOperation.OperationIl valore Operation per questa modifica
DiffOperation.TextIl blocco di testo a cui si applica questa modifica
DiffOperation.EqualsConfronta due modifiche per uguaglianza tramite Operation e Text
DiffOperation.ToStringRende una modifica come stringa per il logging o la visualizzazione
DiffUtilsClasse di supporto statica con utility per il diff di testo
DiffUtils.FindCommonStartPartsTrova il prefisso comune condiviso da due stringhe
DiffUtils.FindCommonEndPartsTrova il suffisso comune condiviso da due stringhe, opzionalmente a partire da un indice
DiffUtils.AssemblySourceTextRicompone il testo originale da un elenco di valori DiffOperation
DiffUtils.AssemblyDestinationTextRicompone il testo revisionato da un elenco di valori DiffOperation

Vedi anche

 Italiano