مقایسه اسناد
مقایسه سند
این راهنما نشان میدهد که چگونه دو اجرای متن را مقایسه کنید و توالی ویرایشها بین آنها را با استفاده از 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 پسوند مشترک را پیدا میکند؛ یک overload از 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 | enum که ویرایشی را بهعنوان 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 بازسازی میکند |