So sánh tài liệu
So sánh tài liệu
Hướng dẫn này cho thấy cách so sánh hai đoạn văn bản và tạo ra chuỗi các chỉnh sửa giữa chúng bằng cách sử dụng động cơ text-diff mã nguồn mở Aspose.PDF cho .NET. Điểm vào cho mô hình so sánh này là DiffOperation, một chỉnh sửa đơn lẻ được gắn thẻ bằng một Operation (Equal, Delete, hoặc Insert), cùng với DiffUtils lớp trợ giúp để xác định văn bản chung và lắp lại diff về văn bản nguồn và đích. Một vòng tối ưu hoá riêng, được mô tả trong Tối ưu hoá Diff, chuẩn hoá đầu ra diff thô được tạo ra theo cách này trước khi nó được hiển thị hoặc áp dụng.
Mô hình Diff: Hoạt động và DiffOperation
Operation là enum phân loại mỗi chỉnh sửa trong một diff: Equal đánh dấu một đoạn văn bản không thay đổi, Delete đánh dấu một đoạn bị loại bỏ khỏi nguồn, và Insert đánh dấu một đoạn được thêm vào đích. DiffOperation ghép một giá trị Operation với Text mà nó áp dụng, và triển khai IEquatable<DiffOperation> để hai chỉnh sửa có thể so sánh về tính bằng nhau.
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"Xác định Văn bản Chung với DiffUtils
DiffUtils là một lớp trợ giúp tĩnh được engine diff sử dụng để tìm tiền tố và hậu tố chung mà hai chuỗi chia sẻ trước khi phần giữa khác nhau được diff. FindCommonStartParts xác định tiền tố chung, và FindCommonEndParts xác định hậu tố chung; một overload của FindCommonEndParts chấp nhận một startIndex để việc tìm hậu tố có thể bị giới hạn trong văn bản theo sau một tiền tố đã được xác định.
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);Ghép lại Văn bản từ một Diff
Khi một diff được biểu diễn dưới dạng một chuỗi các giá trị DiffOperation, DiffUtils có thể tái tạo bất kỳ phía nào của so sánh: AssemblySourceText xây dựng lại văn bản gốc từ các lần chạy Equal và Delete, và AssemblyDestinationText xây dựng lại văn bản đã sửa đổi từ các lần chạy Equal và 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"So sánh và Báo cáo các chỉnh sửa
DiffOperation ghi đè Equals, GetHashCode, và ToString, vì vậy các chỉnh sửa có thể được so sánh về sự bằng nhau hoặc ghi vào log và đầu ra kiểm thử mà không cần mã chuyển đổi bổ sung.
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());Mẹo và Thực tiễn Tốt nhất
DiffOperationlà bất biến và triển khaiIEquatable<DiffOperation>— hãy sử dụngEqualsđể so sánh hai chỉnh sửa thay vì so sánh bằng tham chiếu.- Đầu tiên xác định tiền tố chung bằng
FindCommonStartParts, sau đó truyền độ dài của nó vào overloadstartIndexcủaFindCommonEndPartsđể tránh việc một tiền tố chung ngắn bị đếm đôi như một phần của hậu tố. - Sử dụng
AssemblySourceTextvàAssemblyDestinationTextđể xác minh một chuỗi các giá trịDiffOperationcó thể quay trở lại văn bản gốc và đã sửa đổi một cách chính xác trước khi bạn dựa vào chúng ở nơi khác. - Xem các lần chạy
Operation.Equalnhư không thực hiện gì khi hiển thị diff trực quan, và chỉ tô sáng các lần chạyDeletevàInsert. - Công cụ này so sánh sự khác biệt của văn bản, không phải tài liệu trực tiếp — hãy trích xuất văn bản bạn muốn so sánh (ví dụ, từ một trang hoặc tài liệu) trước khi tạo diff.
Các vấn đề thường gặp
| Vấn đề | Nguyên nhân | Sửa |
|---|---|---|
AssemblySourceText / AssemblyDestinationText đầu ra không khớp với bản gốc | Danh sách diffs không đầy đủ hoặc các mục DiffOperation của nó không theo thứ tự | Bao gồm mọi chỉnh sửa trong chuỗi, theo thứ tự ban đầu mà các chỉnh sửa đã xảy ra |
FindCommonEndParts trả về kết quả không mong đợi trên các chuỗi ngắn, tương tự | Tìm kiếm hậu tố chung trùng lặp văn bản đã được FindCommonStartParts khớp | Truyền độ dài được FindCommonStartParts trả về làm đối số startIndex |
Equals trả về false cho các chỉnh sửa có vẻ giống nhau | Các giá trị Text khác nhau về khoảng trắng hoặc chữ hoa/chữ thường | Chuẩn hoá văn bản (cắt / chuẩn hoá chữ hoa/chữ thường) trước khi tạo các giá trị DiffOperation mà bạn dự định so sánh |
| Kết quả diff trông nhiễu hoặc bị chia thành các phần không cần thiết | Các chuỗi DiffOperation thô chưa được chuẩn hoá | Chạy chuỗi qua bước tối ưu hoá được mô tả trong Tối ưu hoá Diff |
FAQ
Công cụ Diff so sánh những gì?
Nó so sánh các đoạn văn bản và tạo ra một chuỗi các giá trị DiffOperation mô tả các chỉnh sửa — văn bản không thay đổi, bị xóa hoặc được chèn — cần thiết để biến một chuỗi thành chuỗi khác.
Các loại chỉnh sửa nào mà Operation hỗ trợ?
Ba loại: Equal cho văn bản không thay đổi, Delete cho văn bản bị loại bỏ khỏi nguồn, và Insert cho văn bản được thêm vào đích.
Làm sao tôi kiểm tra xem hai chỉnh sửa có giống nhau không?
Gọi Equals trên một thể hiện DiffOperation, hoặc so sánh trực tiếp các thuộc tính Operation và Text của nó.
Tôi có thể lấy lại văn bản gốc và văn bản đã sửa đổi từ một diff không?
Có — truyền danh sách các giá trị DiffOperation cho DiffUtils.AssemblySourceText để lấy văn bản gốc và DiffUtils.AssemblyDestinationText để lấy văn bản đã sửa đổi.
Trang này có đề cập đến việc hợp nhất hoặc làm sạch một diff không?
Không — việc chuẩn hoá một diff thô (gộp các run liền kề, trượt các chỉnh sửa qua các phần bằng nhau) được đề cập riêng trong Tối ưu hoá Diff.
API Reference Tóm tắt
| Lớp / Phương thức | Mô tả |
|---|---|
Operation | Enum phân loại một chỉnh sửa là Equal, Delete, hoặc Insert |
DiffOperation | Một chỉnh sửa duy nhất: một Operation kết hợp với Text mà nó áp dụng |
DiffOperation.Operation | Giá trị Operation cho chỉnh sửa này |
DiffOperation.Text | Đoạn văn bản mà chỉnh sửa này áp dụng |
DiffOperation.Equals | So sánh hai chỉnh sửa để xác định tính bằng nhau bằng Operation và Text |
DiffOperation.ToString | Kết xuất một chỉnh sửa thành chuỗi để ghi log hoặc hiển thị |
DiffUtils | Lớp trợ giúp tĩnh với các tiện ích text-diffing |
DiffUtils.FindCommonStartParts | Tìm tiền tố chung của hai chuỗi |
DiffUtils.FindCommonEndParts | Tìm hậu tố chung của hai chuỗi, tùy chọn bắt đầu từ một chỉ số |
DiffUtils.AssemblySourceText | Ghép lại văn bản gốc từ danh sách các giá trị DiffOperation |
DiffUtils.AssemblyDestinationText | Ghép lại văn bản đã chỉnh sửa từ danh sách các giá trị DiffOperation |