Dokumentum-összehasonlítás
Dokumentum-összehasonlítás
Ez az útmutató bemutatja, hogyan lehet összehasonlítani két szövegsorozatot, és előállítani a közöttük lévő szerkesztési sorozatot a Aspose.PDF FOSS szöveg-diff motor segítségével a .NET számára. Ennek az összehasonlítási modellnek a belépési pontja DiffOperation, egyetlen szerkesztés, amelyhez egy Operation (Equal, Delete, vagy Insert), együtt a DiffUtils segédosztály a közös szöveg megtalálásához és a diff visszaállításához a forrás- és célszövegbe. Egy külön optimalizációs átfutás, amelyet leírva Diff optimalizáció, kanonikalizálja a így előállított nyers diff kimenetet, mielőtt megjelenítenék vagy alkalmaznák.
A Diff modell: Művelet és DiffOperation
Operation egy felsorolt típus (enum), amely besorolja a diff minden szerkesztését: Equal jelöli a változatlan szövegfolyamot, Delete a forrásból eltávolított szövegfolyamot, és Insert a célba hozzáadott szövegfolyamot. DiffOperation egy Operation értéket párosít a rá vonatkozó Text-val, és megvalósítja a IEquatable<DiffOperation>-t, hogy két szerkesztés összehasonlítható legyen egyenlőség szempontjából.
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"Közös szöveg keresése DiffUtils segítségével
DiffUtils egy statikus segédosztály, amelyet a diff motor használ a két karakterlánc által megosztott közös előtag és utótag megtalálására, mielőtt a különböző középső rész diff-elésre kerül. FindCommonStartParts megtalálja a közös előtagot, és FindCommonEndParts megtalálja a közös utótagot; a FindCommonEndParts egy túlterhelése startIndex-t fogad el, hogy az utótag keresés korlátozható legyen a már megtalált előtagot követő szövegre.
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);Szöveg újraösszeállítása diffből
Miután egy különbség sorozatként van kifejezve a DiffOperation értékekből, a DiffUtils képes rekonstruálni a hasonlítás bármelyik oldalát: a AssemblySourceText újjáépíti az eredeti szöveget a Equal és Delete futásokból, és a AssemblyDestinationText újjáépíti a módosított szöveget a Equal és Insert futásokból.
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"Szerkesztések összehasonlítása és jelentése
DiffOperation felülírja a Equals, GetHashCode és ToString elemeket, így a szerkesztések összehasonlíthatók egyenlőség alapján, vagy naplókba és tesztkimenetekbe írhatók extra konverziós kód nélkül.
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());Tippek és legjobb gyakorlatok
DiffOperationnem módosítható és megvalósítja aIEquatable<DiffOperation>– használja aEquals-t két szerkesztés összehasonlításához a referenciális egyenlőség helyett.- Először a
FindCommonStartPartssegítségével keresse meg a közös előtagot, majd adja át annak hosszát aFindCommonEndPartsstartIndextúlterhelésének, hogy elkerülje a rövid közös előtag duplikált számítását a suffix részeként. - Használja a
AssemblySourceTextésAssemblyDestinationTexteszközöket annak ellenőrzésére, hogy egyDiffOperationértékek sorozata pontosan visszatér-e az eredeti és a módosított szöveghez, mielőtt máshol támaszkodna rá. - Kezelje a
Operation.Equalfutásokat no-op-ként a vizuális különbség megjelenítésekor, és csak aDeleteésInsertfutásokat emelje ki. - Ez a motor szöveget hasonlít össze, nem közvetlenül dokumentumokat — a szöveget, amit össze szeretnél hasonlítani (például egy oldalról vagy dokumentumból), először kell kinyerni, mielőtt diffet készítenél.
Gyakori problémák
| Probléma | Oka | Javítás |
|---|---|---|
A AssemblySourceText / AssemblyDestinationText kimenet nem egyezik az eredetikkel | A diffs lista hiányos, vagy a DiffOperation bejegyzései nincsenek helyes sorrendben | Vegye bele a sorozat minden szerkesztését, az eredeti sorrendben, ahogy a szerkesztések megtörténtek |
FindCommonEndParts váratlan eredményt ad rövid, hasonló karakterláncok esetén | A közös utótag keresés átfedést okoz a FindCommonStartParts által már egyezett szöveggel | Adja át a FindCommonStartParts által visszaadott hosszúságot startIndex argumentumként |
Equals visszatér false azonosnak tűnő szerkesztésekhez | A Text értékek szóköz vagy kis- és nagybetű szerint különböznek | Normalizáld a szöveget (vágás / kisbetűre konvertálás) mielőtt létrehoznád a DiffOperation értékeket, amelyeket össze szeretnél hasonlítani |
| A diff kimenet zajosnak vagy indokolatlanul töredezettnek tűnik | A nyers DiffOperation sorozatok még nincsenek kanonikalizálva | Futtasd a sorozatot a leírt optimalizálási lépésen keresztül Diff optimalizálás |
FAQ
Mit hasonlít össze a Diff motor?
Futó szövegeket hasonlít össze, és egy DiffOperation értékekből álló sorozatot állít elő, amelyek leírják a szerkesztéseket — változatlan, törölt vagy beszúrt szöveg — amelyek szükségesek ahhoz, hogy az egyik karakterláncot a másikra alakítsuk.
Milyen szerkesztéstípusokat támogat a Operation?
Három: Equal a változatlan szöveghez, Delete a forrásból eltávolított szöveghez, és Insert a célba hozzáadott szöveghez.
Hogyan ellenőrizhetem, hogy két szerkesztés azonos-e?
Hívja meg a Equals egy DiffOperation példányon, vagy hasonlítsa össze közvetlenül annak Operation és Text tulajdonságait.
Visszakaphatom az eredeti és a módosított szöveget egy diffből?
Igen — adja át a DiffOperation értékek listáját a DiffUtils.AssemblySourceText számára az eredeti szöveghez, és a DiffUtils.AssemblyDestinationText a módosított szöveghez.
Ez az oldal lefedi a diff egyesítését vagy tisztítását?
Nem — a nyers diff kanonikalizálása (szomszédos futamok egyesítése, szerkesztések átsíkosítása az egyenlőségeken) külön van tárgyalva in Különbség optimalizálás.
API Reference összefoglaló
| Osztály / Metódus | Leírás |
|---|---|
Operation | Enum, amely egy szerkesztést Equal, Delete vagy Insert típusúként sorol be |
DiffOperation | Egyetlen szerkesztés: egy Operation, amely a Text-hez van párosítva |
DiffOperation.Operation | Az Operation érték ehhez a szerkesztéshez |
DiffOperation.Text | A szövegrész, amelyre ez a módosítás vonatkozik |
DiffOperation.Equals | Két módosítást hasonlít össze egyenlőség szempontjából Operation és Text alapján |
DiffOperation.ToString | Egy módosítást karakterláncként jelenít meg naplózáshoz vagy megjelenítéshez |
DiffUtils | Statikus segédosztály szöveg-diff segédeszközökkel |
DiffUtils.FindCommonStartParts | Megkeresi a két karakterlánc közös előtagját |
DiffUtils.FindCommonEndParts | Megkeresi a két karakterlánc közös utótagját, opcionálisan egy indextől kezdve |
DiffUtils.AssemblySourceText | Összeállítja az eredeti szöveget a DiffOperation értékek listájából |
DiffUtils.AssemblyDestinationText | Összeállítja a módosított szöveget a DiffOperation értékek listájából |