הפסדתי אחר צהריים פעם אחת לקובץ תצורה ש-" changed" בין שתי פריסות. ההבדל בטרמינל שלי היה קיר של אדום, מאות שורות, וביליתי שעה בחיפוש אחר השינוי האמיתי לפני שהבנתי שצינור הפריסה עיצב מחדש את הקובץ: החדיר אותו מחדש, סידר מחדש כמה תכונות, עטף מחדש כמה שורות ארוכות. לא בייט אחד שלמנתח יהיה אכפת ממנו השתנה בפועל, מלבד ערך בודד שנקבר ברעש. הבדל מבוסס קו לא יכול היה לומר לי את זה, מכיוון ש-diff מבוסס קו לא מבין XML. מדריך זה עוסק בהשוואת XML כפי שמגיע לו להשוות, באמצעות ה בודק הבדלים XML על Toolz.dev, ומדוע השוואה מבנית מוצאת את השינוי האחד שחשוב במקום להטביע אותו בעיצוב.
TL;DR: הבדל XML משווה שני מסמכים כעצי צומת, לא כשורות טקסט, כך שתכונות של כניסה חוזרת, סידור מחדש או עטיפה מחדש של שורות לא נרשמות כשינוי. הוא מדווח אילו אלמנטים, תכונות וערכי טקסט נוספו, הוסרו או שונו, כל אחד מהם הוצמד לנתיב צומת בודק הבדלים XML עושה את זה לגמרי בדפדפן שלך, בלי שום דבר שהועלה.
מהו בודק הבדל XML?
בודק הבדל XML משווה שני מסמכי XML ומדווח על מה שהשתנה כקבוצה של הבדלים מבניים: אילו אלמנטים הופיעו או נעלמו, אילו תכונות שינו ערך והיכן תוכן הטקסט שונה במקום להשוות את הקבצים שורה אחר שורה, הוא מנתח את שניהם לתוך עצי צומת ומשווה אותם כנתונים אתה מדביק את המקור משמאל, את הגרסה החדשה מימין, ומקבל בחזרה רשימה של הבדלים, כל אחד מסומן עם הנתיב המדויק בעץ שבו זה קרה.
הנקודה של השוואה מבנית היא ש-XML נושא את אותה משמעות על פני פריסות בתים רבות ושונות. ה מפרט XML של W3C מפורש שחלק מפרטי פני השטח אינם משפיעים על המסמך המנותח: סדר התכונות על אלמנט אינו משמעותי, והרווח הלבן בין אלמנטים הוא בדרך כלל רק עיצוב. שני קבצים יכולים להיות זהים מבחינה מבנית תוך שהם שונים בהזחה, סדר תכונות, סיומות שורות, או אם אלמנט ריק נכתב כ <tag></tag> או <tag/>. הבדל טקסט רגיל מסמן את כל זה; הבדל מבני מתעלם ממנו ומראה רק מה מנתח באמת יקרא אחרת.
באתר Toolz.dev זרימת העבודה קצרה הדבק את שני המסמכים, בחר אם להתעלם מרווח לבן, תכונות או מקרה, ולחץ על השווה הכלי מנתח את שני העצים ומפרט כל הבדל לפי נתיב, מקובץ לתוך נוסף, הוסר ושונה, עם הערכים הישנים והחדשים זה לצד זה.
במה שונה הבדל XML מהבדל טקסט?
הבדל טקסט, מהסוג המובנה ב-Git וברוב העורכים, משווה קבצים כרצפים של שורות ומוצא את הסט הקצר ביותר של הוספות ומחיקות שהופך אחד לשני. זה בדיוק נכון לקוד מקור, שבו שורות הן יחידות משמעותיות. זהו המודל הלא נכון ל-XML, שבו המשמעות חיה בעץ ומעברי השורות הם קישוט.
מצבי הכשל ניתנים לחיזוי הזינו מחדש את המסמך וטקסט diff מסמן כמעט כל שורה שהשתנתה סדר מחדש שתי תכונות על אלמנט אחד והוא מסמן את השורה הזו למרות שהאלמנט זהה למנתח הוסף ילד בודד ליד החלק העליון וכל שורה מתחתיו זזה, כך שה-diff מראה מפל של מהלכים שאינם באמת שינויים בסופו של דבר אתה סורק מאות שורות מסומנות כדי למצוא את זה שחשוב, שזה אחר הצהריים שתיארתי למעלה.
הבדל מבני עוקף את כל זה על ידי ניתוח תחילה. הוא בונה עץ מכל מסמך, ואז הולך על שני העצים יחד ומשווה צמתים. הפרשי עיצוב פשוט לא קיימים ברמת העץ, אז הם לא יכולים להופיע בפלט. מה שנותר הוא קבוצת השינויים שישנו את אופן התנהגות התוכנה שצורכת את ה-XML, שהיא כמעט תמיד הסט שבאמת אכפת לך ממנו. אם הנתונים שלך הם JSON ולא XML, אותו עיקרון חל JSON Diff כלי עושה שם את ההשוואה המבנית המקבילה.
איך זה מחליט מה השתנה?
ההשוואה מתרחשת בשלוש שכבות בכל אלמנט, והפרדתן היא מה שהופך את הפלט לקריאה.
תכונות מושוות לפי שם, ללא תלות בסדר שהן מופיעות בתג, מכיוון שסדר תכונות אינו משמעותי ב-XML. עבור כל רכיב הכלי בודק אילו תכונות קיימות משני הצדדים, ומדווח על תכונה כפי שהשתנתה כאשר הערך שלה שונה, מתווסף כאשר היא מופיעה רק מימין, או מוסר כאשר היא מופיעה רק משמאל. סידור מחדש <a x="1" y="2"/> ל <a y="2" x="1"/> לא מייצר הבדל בכלל.
תוכן טקסט מושווה כטקסט הישיר של כל אלמנט. עם טיפול ברווחים לבנים, ריצות של רווחים וקווים חדשים ממוטטים ורווחים לבנים מובילים ונגררים נחתכים, כך שהדפסה יפה של המסמך לא יוצרת שינויים בטקסט פנטום. רק שינוי אמיתי במילים בין התגים מדווח.
אלמנטים של ילד הם החלק המעניין אלמנטים שחולקים שם תג מזווגים לפי סדר הופעתם: הראשון <item> משמאל משווים לראשון <item> מימין, השני לשני, וכן הלאה. כאשר בצד אחד יש יותר התרחשויות מהצד השני, התוספות מדווחות כמווספות או מוסרות במקום לכפות חוסר יישור. כלל הסדר הזה הוא מה שמונע משינוי קטן באלמנט אחד שחוזר על עצמו מלהידרדר להפרש של כל אח.
הנה איך שני דגמי ההשוואה מסתדרים:
| אספקט | הבדל טקסט | XML diff (מבני) |
|---|---|---|
| יחידה בהשוואה | שורות טקסט | צמתים בעץ |
| הזחה מחדש | מציג כשינויים | התעלם |
| סדר מחדש של תכונה | מראה כשינוי | התעלם |
| דוחות משנים מיקום | מספר שורה | נתיב צומת, למשל /catalog/book[2]/@id |
| מבחין בין אלמנט מול תכונה מול טקסט | לא | כן |
| הטוב ביותר עבור | קוד מקור, פרוזה | תצורת XML, מטענים API, SVG, מפות אתר |
דוגמה קונקרטית מבהירה את השכבות קח קטלוג ספרים קטן שבו, בין שתי גרסאות, ספר אחד ' תכונת הקטגוריה של s משתנה מסיפורת למסתורין, אותו ספר ' טקסט המחיר של s משתנה מ-12.99 ל-14.99, והספר השני זוכה לאלמנט isbn חדש הבדל קו יסמן את שלושתם בתוספת כל הזחה מחדש סביבם, מבולבלים יחד ההבדל המבני מדווח בדיוק על שלושה הבדלים: תכונה שונה בנתיב הקטגוריה, צומת טקסט שונה בנתיב המחיר, ואלמנט נוסף בנתיב isbn כל אחד מתויג עם הסוג שלו, כך שאתה יכול לדעת במבט חטוף ששניים היו עריכות לנתונים קיימים ואחד היה תוספת אמיתית ההפרדה הזו היא ההבדל בין קריאת דוח לפענוח אחד.
הכלי גם מקבץ את התוצאות ללשוניות שנוספו, הוסרו והשתנו עם ספירה פועלת, כך שתוכל לענות תחילה על שאלות גסות, כגון " האם כל דבר נמחק, " לפני הקידוח לפרטים. במסמך גדול הסדר הזה משנה: הסרות הן לרוב השינוי המסוכן ביותר, מכיוון שאלמנט שנפל יכול להפשיט בשקט שדה נדרש, והיכולת לבודד אותם מבלי להשתכשך בעריכות לא קשורות היא חיסכון בזמן אמת.
מה המשמעות של נתיב הצומת בהבדל?
כל הבדל מסומן בנתיב שאומר לך בדיוק היכן בעץ הוא יושב, כך שתוכל לקפוץ אליו במקום לסרוק את הקובץ הנתיב בנוי משמות אלמנטים, המחוברים על ידי חתכים מהשורש ומטה כאשר לאלמנט יש אחים באותו שם, אינדקס מבוסס אחד בסוגריים מבדיל איזה מהם, אז /catalog/book[2] הוא הספר השני תכונה נכתבת עם an @ קידומת, כמו ב /catalog/book[1]/@category, ושינוי טקסט מסומן ב text(), כמו ב /catalog/book[2]/price/text().
סימון זה קרוב בכוונה ל XPath, שפת W3C להתייחסות לצמתים במסמך XML, כך שאם כבר קראת XPath הנתיבים ירגישו מוכרים ולעתים קרובות תוכל להדביק ביטוי דומה בכלי שלך לבחירת אותו צומת. אפילו בלי לדעת XPath, הנתיבים נקראים באופן טבעי: שמות יורדים בעץ, סוגריים בוחרים אח, @ היא תכונה, ו text() הוא התוכן.
מכיוון שגם הנתיב מציין את סוג השינוי, הדוח עונה על שלוש שאלות בבת אחת: מה השתנה, היכן הוא חי והאם זה היה אלמנט, תכונה או טקסט. זה בדרך כלל מספיק כדי לפתוח את הקובץ הנכון ולתקן את הקו הנכון ללא כל ציד נוסף.
מתי באמת אשתמש בזה?
סחף תצורה הוא המקרה שפגעתי בו יותר מכל כאשר שירות מתנהג בצורה שונה בין שתי סביבות והחשוד היחיד הוא תצורת XML, השוואת שני הקבצים מבחינה מבנית אומרת לך תוך שניות אם ערך השתנה באמת או שמישהו פשוט עיצב מחדש את הקובץ. אותו הדבר חל על בנייה ופריסה של צינורות המשכתבים XML, שבהם אתה צריך לאשר טרנספורמציה שהשתנתה רק מה שהיא הייתה אמורה לעשות.
API ועבודת אינטגרציה היא הבאה. SOAP תגובות, RSS ו Atom הזנות, ו REST APIs ישנים עדיין מדברים XML, וכאשר מטען מפסיק לנתח בצורה נכונה הבדל מבני מול מדגם ידוע-טוב מצביע על האלמנט הפוגע מהר. SVG הוא XML מדי, כך השוואת שני סמלים מיוצאים מראה בדיוק איזה נתיב או תכונה עורך השתנה. Sitemaps, קבצי פריסת אנדרואיד, Maven POMs, ו .docx פנימיות הן כולן XML מתחת למכסה המנוע, וכולן נהנות מאותו טיפול. אני בונה על פני הערימה, ו-XML מופיע ביותר פינות ממה שאנשים מצפים, וזו הסיבה שזה חי ליד פורמט XML ו XML ל-JSON בסימניות שלי שרטטתי איך אלה מתאימים לערכה רחבה יותר ב מדריך JSON ל-XML.
יש גם זווית סקירת קוד. כאשר בקשת משיכה נוגעת במתקן XML או בקובץ שנוצר, ההבדל הגולמי בממשק המשתמש של הסקירה לרוב אינו קריא מכיוון שמעצב כתב מחדש את כל העניין. הפעלת לפני ואחרי באמצעות השוואה מבנית, ולאחר מכן הדבקת הדוח הקצר בסקירה, אומרת למבקר שלך מה השתנה בפועל במבט אחד במקום לבקש ממנו לסמוך על קיר אדום. הכלי ' דוח טקסט שניתן להעתיק קיים בדיוק בשביל זה: סיכום קומפקטי של כל צומת שנוסף, הוסר ושונה עם ערכי לפני ואחרי שלו, מוכן לרדת לכרטיס, הודעת התחייבות או שרשור צ'אט.
כלי ההשוואה השכנים מכסים את המקרים ש-XML diff לא. כאשר הנתונים שלך הם טבלאיים, ה CSV Diff משווה שורות ותאים, ועבור שתי רשימות פשוטות את רשימה השווה הכלי אכן קובע הבדלים. הם חולקים את אותה פילוסופיה: תחילה נתח את הנתונים לצורתם הטבעית, ולאחר מכן השווה, כך שההבדל משקף משמעות ולא פריסה.
מהם הגבולות, והאם ה-XML שלי פרטי?
הכלי משווה מבנה, מה שאומר שהוא בכוונה לא מדווח על סוגי ההבדלים שהמבנה לא לוכד. סידור מחדש של שתי תכונות, שינוי הזחה או החלפת תחביר סגירה עצמית מטופלים כולם כלא שינוי, לפי עיצוב. אם מקרה השימוש שלך באמת זקוק להשוואה מדויקת של בתים, הבדל טקסט הוא הכלי הנכון וזה לא. ההבדל המבני גם מצמיד אלמנטים חוזרים לפי מיקום, כך שאם אותן רשומות מערבבות לסדר אחר, הכלי רואה את אלה שהועברו כמשתנים ולא מועברים; מיון שני המסמכים על ידי מפתח יציב תחילה, כאשר זה הגיוני, נותן את התוצאה הנקייה ביותר.
XML שגוי מדווח במקום לנחש. אם למסמך יש תג לא תואם או לא סגור, או יותר מאלמנט שורש אחד, הכלי נותן שם לבעיה ואומר לך מאיזה צד הוא הגיע, כך שלעולם לא תקבל הבדל מטעה מקלט שבור. הוא מטפל במבנים הנפוצים בעולם האמיתי שמנתח חייב: תכונות במירכאות בודדות או כפולות, תגי סגירה עצמית, קטעי CDATA, הערות, הוראות עיבוד והפניות סטנדרטיות לישות כמו < ו &.
על פרטיות, הכל פועל בדפדפן שלך שני המסמכים מנותחים ומשווים באופן מקומי, ושום דבר לא מועלה, נרשם או מאוחסן. זה המאפיין שהופך את זה בטוח להבדיל בין תצורת ייצור, מטען API פנימי או קובץ ספציפי ללקוח, שאף אחד מהם לא שייך לשרת stranger's. ה פרטיות נתונים בכלים מקוונים המדריך מסביר כיצד לאמת שכלי הוא באמת צד הלקוח, מה שכדאי לעשות לפני שאתה מדביק משהו רגיש בכלי אינטרנט כלשהו.
שאלות נפוצות
כיצד אוכל להשוות בין שני קבצי XML?
הדבק את ה-XML המקורי בשדה הראשון ואת ה-XML שהשתנה בשדה השני, ולאחר מכן הקש Compare. הכלי מנתח את שניהם לעצי צומת ומפרט כל רכיב, תכונה וערך טקסט שנוספו, הוסרו ושונו, כל אחד מוצמד לנתיב הצומת שלו. שום דבר לא מועלה.
במה שונה הבדל XML מהבדל טקסט רגיל?
הבדל טקסט משווה קבצים שורה אחר שורה, כך שהחזרה, סידור מחדש של תכונות או עטיפה מחדש של שורות גורמת כמעט לכל דבר להיראות שונה. הבדל XML מנתח תחילה את שני המסמכים לעצים ומשווה אותם מבחינה מבנית, כך שהוא מדווח רק על הבדלים שישנו את האופן שבו מנתח קורא את המסמך.
האם סידור מחדש של תכונות נחשב כשינוי?
מס 'תכונות מושוות לפי שם ללא קשר לסדר שהן מופיעות בתג, מכיוון שסדר תכונות אינו משמעותי ב - XML. רק ערך שהשתנה, תכונה שנוספה או תכונה שהוסרה מדווחים.
כיצד מתאימים אלמנטים חוזרים בין שני המסמכים?
רכיבי ילד החולקים שם תג מזווגים לפי סדר הופעתם, כך שהפריט הראשון מושווה לפריט הראשון, השני לשני וכן הלאה. אם למסמך אחד יש יותר מופעים מהשני, התוספות מדווחות כמווספות או מוסרות.
מה המשמעות של נתיב הצומת בכל הבדל?
הנתיב מראה היכן בעץ השינוי הוא, באמצעות שמות אלמנטים, אינדקס מבוסס אחד בסוגריים כאשר יש אחים באותו שם, @name עבור תכונה וטקסט () עבור תוכן טקסט. לדוגמה, /catalog/book[2]/@id מצביע על תכונת ה-id של הספר השני.
האם רווח לבן או עיצוב משפיעים על ההשוואה?
כברירת מחדל מתעלמים מטקסט של רווח לבן בלבד והריצות של רווח לבן בתוך טקסט מכווצות, כך שעיצוב מחדש של המסמך אינו יוצר הבדלים כוזבים. אתה יכול להסתמך על ההשוואה המבנית במקום להתאים את ההזחה במדויק.
מה קורה אם ה-XML פגום?
הכלי מדווח על שגיאה ברורה במתן שם לבעיה, כגון תג לא תואם או לא סגור, ואומר לך מאיזה מסמך הוא הגיע. זה לא מנחש על תיקון, אז אתה אף פעם לא מקבל הבדל מטעה מקלט שבור.
האם מסמכי ה-XML שלי מועלים לכל מקום?
מס 'כל הניתוח וההשוואה קורים כמו JavaScript בדפדפן שלך שום דבר לא מועבר, נרשם, או מאוחסן אתה יכול לאשר זאת על ידי צפייה בכרטיסייה הרשת או על ידי ניתוק מהאינטרנט, הכלי ממשיך לעבוד במצב לא מקוון.
השווה את המסמכים שלך עם החינם בודק הבדלים XML. הוא מדווח על הבדלים מבניים לפי נתיב צומת, כולו בדפדפן שלך, בלי שום דבר שהועלה.



