مقارنة المستندات
مقارنة المستندات
هذا الدليل يوضح كيفية مقارنة نصين وإنتاج تسلسل التعديلات بينهما باستخدام محرك الفروقات النصية المفتوح المصدر Aspose.PDF لـ .NET. نقطة الدخول لهذا النموذج المقارن هي DiffOperation, تعديل واحد معلم بـ Operation (Equal, Delete, أو Insert)، مع DiffUtils فئة مساعدة لتحديد النص المشترك وإعادة تجميع الفرق مرة أخرى إلى نص المصدر والوجهة. تمريرة تحسين منفصلة، موصوفة في تحسين الفروقات, يُقنِّع مخرجات الفرق الخام التي تم إنتاجها بهذه الطريقة قبل أن تُعرض أو تُطبق.
نموذج الفروقات: العملية و DiffOperation
Operation هو التعداد الذي يصنف كل تعديل في الفروقات: 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);إعادة تجميع النص من فرق
بمجرد أن يتم التعبير عن الفرق كسلسلة من قيم 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كعمليات لا تفعل شيئًا عند عرض فرق بصري، وقم بتسليط الضوء فقط على تشغيلاتDeleteوInsert. - هذه الأداة تقارن النصوص، لا المستندات مباشرة — استخرج النص الذي تريد مقارنته (على سبيل المثال، من صفحة أو مستند) قبل إنشاء المقارنة.
المشكلات الشائعة
| مشكلة | السبب | إصلاح |
|---|---|---|
إخراج AssemblySourceText / AssemblyDestinationText لا يتطابق مع الأصليين | قائمة diffs غير مكتملة أو أن إدخالات DiffOperation الخاصة بها غير مرتبة | ضمّن كل تعديل في السلسلة، بالترتيب الأصلي الذي حدثت فيه التعديلات |
FindCommonEndParts يعطي نتيجة غير متوقعة على سلاسل قصيرة ومتشابهة | بحث اللواحق المشتركة يتداخل مع النص الذي تم مطابقته بالفعل بواسطة FindCommonStartParts | مرّر الطول الذي يُعيده FindCommonStartParts كمعامل startIndex |
Equals يُعيد false للتعديلات التي تبدو متطابقة | القيم Text تختلف بالمسافات أو حالة الأحرف | قم بتطبيع النص (trim / case-fold) قبل إنشاء قيم DiffOperation التي تنوي مقارنتها |
| مخرجات Diff تبدو صاخبة أو مُجزأة بصورة غير ضرورية | التسلسلات الخام DiffOperation لم يتم تقنينها بعد | قم بتمرير التسلسل عبر مرحلة التحسين الموصوفة في تحسين الفروقات |
FAQ
ماذا تقارن أداة الـ Diff؟
إنها تقارن سلاسل النص وتنتج تسلسلاً من قيم DiffOperation التي تصف التعديلات — النص غير المتغير، المحذوف أو المُدرج — اللازمة لتحويل سلسلة إلى أخرى.
ما أنواع التعديلات التي يدعمها Operation؟
ثلاثة: Equal للنص غير المتغير، Delete للنص الذي أزيل من المصدر، وInsert للنص المضاف في الوجهة.
كيف يمكنني التحقق مما إذا كان التعديلان متماثلان؟
استدعِ Equals على كائن DiffOperation، أو قارن خصائصه Operation وText مباشرةً.
هل يمكنني استرجاع النص الأصلي والنص المعدل من diff؟
نعم — مرّر قائمة قيم DiffOperation إلى DiffUtils.AssemblySourceText للنص الأصلي وDiffUtils.AssemblyDestinationText للنص المعدل.
هل تغطي هذه الصفحة دمج أو تنظيف 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 |