Порівняння документів
Порівняння документів
Цей посібник показує, як порівняти два варіанти тексту та створити послідовність правок між ними, використовуючи Aspose.PDF FOSS text-diff engine для .NET. Точка входу для цієї моделі порівняння є DiffOperation, окрема правка, позначена Operation (Equal, Delete, або Insert), разом із DiffUtils допоміжним класом для знаходження спільного тексту та повторного складання diff у його вихідний та цільовий текст. Окремий етап оптимізації, описаний у Оптимізація Diff, канонізує необроблений diff-вивід, створений таким чином, перед його відображенням або застосуванням.
Модель дифу: Операція та DiffOperation
Operation — це enum, який класифікує кожну правку у дифі: Equal позначає фрагмент тексту, який не змінився, Delete позначає фрагмент, видалений з джерела, а Insert позначає фрагмент, доданий у цільовий текст. DiffOperation поєднує значення Operation з Text, до якого воно застосовується, і реалізує IEquatable<DiffOperation>, щоб дві правки можна було порівняти на рівність.
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"Пошук спільного тексту за допомогою DiffUtils
DiffUtils — це статичний допоміжний клас, який використовується движком дифу для знаходження спільного префікса та суфікса, спільних для двох рядків, перед тим як різна середня частина буде дифована. FindCommonStartParts знаходить спільний префікс, а FindCommonEndParts — спільний суфікс; перевантаження FindCommonEndParts приймає startIndex, щоб пошук суфікса можна було обмежити текстом, який йде після вже знайденого префікса.
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);Відновлення тексту з дифу
Коли diff виражається як послідовність значень DiffOperation, DiffUtils може відновити будь-яку сторону порівняння: AssemblySourceText відбудовує оригінальний текст з Equal і Delete запусків, а AssemblyDestinationText відбудовує оновлений текст з Equal і 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"Порівняння та звітування про зміни
DiffOperation переопреділяє Equals, GetHashCode і ToString, тому зміни можна порівнювати на рівність або записувати в журнали та тестовий вивід без додаткового коду конвертації.
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());Поради та найкращі практики
DiffOperationє незмінним і реалізуєIEquatable<DiffOperation>— використовуйтеEqualsдля порівняння двох змін, а не рівність посилань.- Спочатку знайдіть спільний префікс за допомогою
FindCommonStartParts, потім передайте його довжину у перевантаженняstartIndexфункціїFindCommonEndParts, щоб уникнути подвійного підрахунку короткого спільного префікса як частини суфікса. - Використовуйте
AssemblySourceTextіAssemblyDestinationText, щоб перевірити, що послідовність значеньDiffOperationпроходить круговий шлях до точного оригінального та оновленого тексту, перш ніж покладатися на неї в іншому місці. - Розглядайте запускі
Operation.Equalяк бездіяльність під час рендерингу візуального diff і підсвічуйте лише запускіDeleteіInsert. - Цей движок порівнює текст, а не документи безпосередньо — спочатку витягніть текст, який ви хочете порівняти (наприклад, зі сторінки або документа), перед створенням різниці.
Типові проблеми
| Проблема | Причина | Виправити |
|---|---|---|
AssemblySourceText / AssemblyDestinationText вихід не відповідає оригіналам | Список diffs неповний або його DiffOperation записи не у правильному порядку | Включіть кожне редагування у послідовність у тому ж порядку, у якому вони відбулися |
FindCommonEndParts повертає неочікуваний результат для коротких, схожих рядків | Пошук спільного суфікса перекриває текст, вже збігнутий FindCommonStartParts | Передайте довжину, яку повертає FindCommonStartParts, як аргумент startIndex |
Equals повертає false для правок, які виглядають ідентично | Значення Text відрізняються пробілами або регістром | Нормалізуйте текст (усічення / уніфікація регістру) перед створенням значень DiffOperation, які ви плануєте порівнювати |
| Вивід diff виглядає шумним або зайво фрагментованим | Необроблені послідовності DiffOperation ще не канонізовані | Запустіть послідовність через оптимізаційний прохід, описаний у Оптимізація Diff |
FAQ
Що порівнює движок Diff?
Він порівнює послідовності тексту і створює послідовність значень DiffOperation, що описують правки — незмінений, видалений або вставлений текст — необхідне для перетворення одного рядка в інший.
Які типи правок підтримує Operation?
Три: Equal для незмінного тексту, Delete для тексту, видаленого з джерела, і Insert для тексту, доданого в призначення.
Як перевірити, чи два правки однакові?
Викличте Equals на екземплярі DiffOperation, або порівняйте його властивості Operation та Text безпосередньо.
Чи можу я отримати оригінальний та переглянутий текст з diff?
Так — передайте список значень DiffOperation у DiffUtils.AssemblySourceText для оригінального тексту та у DiffUtils.AssemblyDestinationText для переглянутого тексту.
Чи охоплює ця сторінка злиття або очищення diff?
Ні — канонізування необробленого diff (об’єднання суміжних ділянок, зсув правок через рівності) розглядається окремо в Оптимізація Diff.
API Reference Підсумок
| Клас / Метод | Опис |
|---|---|
Operation | Перелічення, що класифікує правку як Equal, Delete або Insert |
DiffOperation | Один елемент правки: Operation, пов’язаний з Text, до якого він застосовується |
DiffOperation.Operation | Значення Operation для цієї правки |
DiffOperation.Text | Послідовність тексту, до якої застосовується це редагування |
DiffOperation.Equals | Порівнює два редагування на рівність за допомогою Operation та Text |
DiffOperation.ToString | Відображає редагування у вигляді рядка для журналювання або відображення |
DiffUtils | Статичний допоміжний клас з утилітами для порівняння тексту |
DiffUtils.FindCommonStartParts | Знаходить спільний префікс, який ділять два рядки |
DiffUtils.FindCommonEndParts | Знаходить спільний суфікс, спільний для двох рядків, опційно, починаючи з індексу |
DiffUtils.AssemblySourceText | Збирає оригінальний текст зі списку значень DiffOperation |
DiffUtils.AssemblyDestinationText | Збирає відкоригований текст зі списку значень DiffOperation |