VTD-XML

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה לניווט קפיצה לחיפוש

VTD-XML‏ (Virtual Token Descriptor for eXtensible Markup Language - ספרייה לפענוח תגיות בקובצי XML) מתייחסת לאוסף של טכנולוגיות עיבוד XML בין פלטפורמות המתמקדות בטכניקת XML לא ניתוחית[1], "מתמקדת במסמך" הנקראת Virtual Token Descriptor (VTD). בהתאם לפרספקטיבה, VTD-XML ניתן לראות אחת מהפעולות הבאות:

VTD-XML פותחה על ידי XimpleWare תחת רישיון GPL. הוא נכתב במקור JAVA, אבל הוא זמין כעת ב-C[12]‏, C++ וסי שארפ .

רעיון בסיסי[עריכת קוד מקור | עריכה]

ניתוח מסמך XML כאובייקט טקסט אחד בעזרת אינדקסים[עריכת קוד מקור | עריכה]

באופן מסורתי, מנתח מילולי מייצג Tokens (יחידות קטנות של תווים בלתי ניתנים לחלוקה) כאובייקטים של מחרוזות נפרדות. גישה זו מיועדת בחילוץ המידע לאובייקטים. לעומת זאת, שיטת האינדקסים לא מחייבת לשמור על טקסט המקור שלם, ומשתמשת במיקום ואורך המידע לתיאור התווים (Tokens).

מתאר Token וירטואלי[עריכת קוד מקור | עריכה]

Virtual Token Descriptor (VTD) מיישם את שיטת האינדקסים לעיבוד XML. השימוש ב-64 סיביות כדי לקודד את המיקום, אורך, סוג Token ועומק קינון של Token במסמך XML. מכיוון שכל רשומות ה- VTD הן באורך 64 סיביות, ניתן לאחסן אותן ביעילות ולנהל אותן כמערך.[13]

מיקום מטמון[עריכת קוד מקור | עריכה]

מטמוני מיקום (LC) מבוססים על רשומות VTD כדי לספק גישה אקראית יעילה. מאורגנים בטבלאות, עם טבלה אחת לכל רמת עומק קינון, LCs מכילים מודלים של היררכיה של האלמנט במסמך ה-XML. ערך LC הוא מספר שלם של 64 סיביות המקודד לזוג ערכים של 32 סיביות. ה-32 סיביות העליונות מזהות את רשומת ה- VTD עבור האלמנט המתאים. ה-32 סיביות התחתונות מזהים את הילד הראשון של האלמנט LC ברמת הקינון התחתון הבא.

יתרונות[עריכת קוד מקור | עריכה]

סקירה כללית[עריכת קוד מקור | עריכה]

כמעט כל יתרונות ליבה של VTD-XML הם בעקבות שיטת האינדקסים המספקת מאפיינים אלה:

  • טקסט המקור של ה-XML נשמר שלם בזיכרון ללא פענוח.
  • הייצוג הפנימי של VTD-XML הוא Persistence מטבעו.
  • מונע מודלים מונחה עצמים של הייצוג ההיררכי כפי שהוא מסתמך כולו על סוגי נתונים פרימיטיביים (למשל, מספרים שלמים של 64 סיביות) כדי לייצג את היררכית ה- XML, ובכך להפחית את עלות יצירת האובייקטים כמעט לאפס.[14]

שילוב המאפיינים האלה מאפשר לחשוב על XML באופן טהור כמערך במקום סריאליזציה והמרה של אובייקטים שונים. זוהי דרך רבת עוצמה לחשוב על יישומי XML / SOA .

התאמה[עריכת קוד מקור | עריכה]

VTD-XML תואם רק לגרסאות XML 1.0 (למעט החלק DTD) ו- XML Name 1.0. יש תאימות ל-XPath 1.0 (עם כמה הבדלים מתוחכמים במונחים של מודל הנתונים) עם הרחבה של XPath 2.0.

פשטות[עריכת קוד מקור | עריכה]

כמנתח (Parser)[עריכת קוד מקור | עריכה]

כאשר נעשה שימוש במצב ניתוח, מטרתו של VTD-XML היא ביצועים גבוהים מאוד[15].

VTD-XML בהשוואה לאחרים כמנתח:

  • VTD-XML בדרך כלל עולה על ה-SAX (עם מטפל תוכן Null) ועדיין מספק גישה אקראית מלאה ותמיכה מובנית ב-XPath.
  • VTD-XML בדרך כלל שומרת בזיכרון 130%-150% מגודל מסמך XML בזיכרון, המהווה בערך 20% מהשימוש בזיכרון של DOM.
  • יישומים שנכתב ב-VTD-XML הם בדרך כלל הרבה יותר קצרים ונקיים יותר מאשר גרסאות ה-DOM / SAX שלהם.

כאינדקס[עריכת קוד מקור | עריכה]

בזכות מיפוי האינדקסים שעושה VTD-XML, מפתחים יכולים לכתוב את הייצוג הפנימי של מסמך XML מנותח לדיסק ולאחר מכן לטעון אותו מחדש כדי למנוע ניתוח חוזר. לשם כך, XimpleWare[16] הציגה פורמט אריזה בינארי המשלב VTD, LC ו-XML (טקסט). ניתן להציג אותה באחת משתי הדרכים הבאות:

  • אינדקס XML מקומי שמבטל לחלוטין את עלות הניתוח וגם שומר על כל היתרונות של XML. זהו פורמט קובץ קריא לבני אדם עם תאימות לאחור.
  • תבנית XML בינארית המשתמשת בנתונים בינאריים כדי לשפר את העיבוד של טקסט ה- XML.

שינוי תוכן XML[עריכת קוד מקור | עריכה]

בגלל ש-VTD-XML שומר על טקסט שלם ללא פענוח, כאשר יישום מתכוון לשנות את התוכן של XML הוא רק צריך לשנות את החלקים הרלוונטיים. זה בניגוד מוחלט עם DOM, SAX, או ניתוח StAx, אשר כרוכות בעלות ניתוח מחדש, לא משנה כמה קטנים השינויים.

מאחר ש-VTD מתייחס לרכיבי מסמך על ידי מיקום התו, שינויים באורך האלמנטים המתרחשים קודם לכן במסמך מחייבים התאמות אינדקסים המתייחסות לכל האלמנטים המאוחרים. עם זאת, התאמות אלה הן של מספור אינדקסים מחדש, אם כי השינויים הם רבים בטבלאות מרובות, אז הם מהירים.

חיתוך, פיצול והרכבת מקטעי XML[עריכת קוד מקור | עריכה]

יישום המבוסס על VTD-XML יכול גם להשתמש במיקומים ואורכים לכתובת Token, או חלקי אלמנטים. זה מאפשר לבצע פעולות על מסמכי XML כמו על מערכים של בתים.

  • VTD-XML יכול לחתוך Token או קטע רכיב ממסמך XML, ולאחר מכן להחזירו בחזרה למיקום אחר באותו מסמך, או למסמך אחר.
  • VTD-XML יכול לפצל תת-אלמנטים במסמך XML ולהטמיע את הקטע במסמכי XML אחרים.
  • VTD-XML יכול לחתוך מקטעים מתוך מסמכי XML מרובים להרכיב אותם לתוך מסמך XML חדש.

עורך XML[עריכת קוד מקור | עריכה]

VTD-XML יכול לערוך / למחוק ישירות את התוכן ברמת ה-Byte של טקסט XML, ובלבד שאורך ה-Token ארוך יותר מאשר התוכן החדש המיועד. היתרון של גישה זו היא שיישום יכול לעשות שימוש חוזר ומיידי ב-VTD וה- LC המקורי. לעומת זאת, בעת שימוש ב- VTD-XML לצורך עדכון שותף של מסמך XML, היישום צריך לעבד את המסמך המעודכן לפני שהיישום יוכל לעבד אותו.

עורך יכול להיות חכם מספיק כדי לעקוב אחר המיקום של כל Token, המאפשרים חדשים, אסימונים ארוכים יותר להחליף קיימים, קצרים אסימונים רק על ידי התייחסות לאסימון החדש בזיכרון נפרד מחוץ המשמש לאחסון המסמך המקורי. כמו כן, כאשר reordering את המסמך, טקסט אלמנט לא צריך להעתיק; רק את LCs צריך להיות מעודכן. כאשר נדרש מסמך XML מלא, רציף, כגון בעת שמירתו, ניתן לחלק את החלקים השונים למסמך חדש רציף.

יתרונות אחרים[עריכת קוד מקור | עריכה]

VTD-XML גם חלוצים את בגישת non-blocking, והתפתחות של XPath.   [ <span title="This claim needs references to reliable sources. (January 2009)">ציטטה הצורך</span> ]

חולשות[עריכת קוד מקור | עריכה]

VTD-XML גם מציג כמה חסרונות בולטים:

  • כמנתח XML, הוא אינו תומך בגופים חיצוניים המוצהרים ב- DTD.
  • כפורמט קובץ, הוא מגדיל את גודל המסמך בכ -30% עד 50%.
  • כמו API, זה לא תואם DOM, SAX או STAX .
  • קשה לתמוך בטכניקות אימות מסוימות, המועלות על ידי DTD ו- XML Schema (למשל, attributes ברירת מחדל ו-elements), המחייבות שינויים במודלי XML המנותחים.

תחומי היישומים[עריכת קוד מקור | עריכה]

תחליף כללי עבור DOM או SAX[עריכת קוד מקור | עריכה]

בגלל הביצועים של VTD-XML וזיכרון היתרונות, הוא מכסה חלק גדול יותר של מקרים להשתמש ב- XML או DOM או SAX.[17]

  • לעומת DOM, VTD-XML תהליכים גדולים יותר (3x ~ 5x) מסמכי XML עבור אותה כמות של זיכרון פיזי בסביבות 3 עד 10 פעמים את הביצועים.
  • לעומת SAX, VTD-XML מספק גישה אקראית תמיכה XPath ו outperforms SAX על ידי לפחות 2x.

XPath על מסמכי XML ענקיים[עריכת קוד מקור | עריכה]

המהדורה המורחבת של VTD-XML באיחוד עם JVM 64-bit מאפשרת עיבוד XML מבוסס XPath על גבי מסמכי XML ענקיים (עד גודל של 256 GB).

עבור SOA / WS / XML אבטחה[עריכת קוד מקור | עריכה]

השילוב של ביצועים גבוהים של VTD-XML ויכולת עדכון מצטבר הופך את הכרחי[18][19][20] כדי להשיג את הרמה הרצויה של איכות השירות עבור יישומי אבטחה של SOA / WS / XML.

עבור SOA / WS / XML מתווך[עריכת קוד מקור | עריכה]

VTD-XML מתאים במיוחד ליישומי ביניים של SOA כגון נתבי XML / מתגים / שערים, Enterprise Service Buses ונקודות צבירה של שירותים. כל היישומים הללו מבצעים את פעולות "החנות והפנים" הבסיסיות, אשר לשמירתן של XML המקורי הן קריטיות לצמצום זמן האחזור. יכולת העדכון התוספתית של VTD-XML תורמת באופן משמעותי לביצועי ההעברה.

יכולת הגישה האקראית של VTD-XML משפיעה היטב על ניתוב XML / מיתוג / סינון ב- XPath המבוססת על פריסת AJAX ו- SOA.

אינטליגנטי SOA / WS / XML עומס עומס ופריקה[עריכת קוד מקור | עריכה]

כאשר מסמך XML נוסע דרך מספר רכיבים באמצע SOA באמצע, לעצור את ההודעה הראשונה, לאחר שסיים את הבדיקה של מסמך XML, יכול לבחור לשלוח את פורמט קובץ VTD + XML לרכיבים במורד כדי למנוע ניתוח חוזר, ובכך לשפר את התפוקה.

באותו אופן, איזון עומס אינטליגנטי SOA יכול לבחור ליצור VTD + XML עבור הודעות SOAP נכנסות / יוצאות לפרוק ניתוח XML משרתי היישומים שמקבלים הודעות אלה.

מאגר נתונים של התמדה ב- XML[עריכת קוד מקור | עריכה]

כאשר מסתכלים מנקודת המבט של התמדה XML יליד, VTD-XML יכול לשמש אינדקס XML קריא אנושי, קל לשימוש, למטרות כלליות. מסמכי XML המאוחסנים בדרך זו ניתנים לטעינה לזיכרון, לשאילתה, לעדכון או לעריכה ללא תקורה של ניתוח / עריכה בסדרה חוזרת.

נתונים XML מחייב נתונים[עריכת קוד מקור | עריכה]

שילוב VTD-XML של ביצועים גבוהים, שימוש בזיכרון נמוך, והערכת XPath יעילה מאפשרת גישה חדשה לנתוני XML, המבוססים לחלוטין על XPath. היתרון הגדול ביותר של גישה זו הוא כבר לא דורש סכימת XML, נמנע יצירת אובייקטים מיותרים, ולוקח את היתרון של קידוד משוחרר של XML.[21]

ראוי לציין כי מחייב נתונים שנדונו במאמר המוזכר לעיל צריך להיות מיושם על ידי היישום: VTD-XML עצמה מציעה רק accessors. בהקשר זה VTD-XML הוא לא פתרון מחייב נתונים עצמו (בניגוד JiBX, JAXB, XMLBeans), למרות שהוא מציע פונקציונליות החילוץ עבור חבילות מחייב נתונים, הרבה כמו מנתחי XML אחרים ( DOM, SAX, Stax ).

כיתות חיוניות[עריכת קוד מקור | עריכה]

החל בגרסה 2.11, Java ו- C # גרסאות של VTD-XML מורכבות מהשיעורים הבאים:

  • VTDGen (VTD גנרטור) הוא המעמד כי encapsulates הראשי ניתוח, אינדקס טוען פונקציות אינדקס כתיבה.
  • VTDNav ( VTDNigator ) הוא המעמד (1) כולל XML, VTD ומידע היררכי, (2) מכיל שיטות ניווט שונות, (3) מבצע השוואות שונות בין רשומות VTD לבין מחרוזות, ו (4) ממיר רשומות VTD לפרימיטיבי סוגי מידע.
  • AutoPilot הוא מחלקה המכילה פונקציות המבצעות איטרציה ברמת הצומת ו- XPath.
  • XMLModifier הוא מחלקה המציעה יכולת עדכון מצטבר, כגון מחיקה, הוספה ועדכון.

ה- VTD-XML המורחב מורכב מהשיעורים הבאים:

  • VTDGenHuge (מחולל VTD מורחב) מתמצת את הניתוח הראשי.
  • XMLBuffer מבצע טעינה בזיכרון של מסמכי XML.
  • XMLMemMappedBuffer מבצע זיכרון ממופה זיכרון של מסמכי XML.
  • VTDNavHuge (Extended VTD Navigator) 1) מתמצת XML, VTD מורחב, ומידע היררכי, (2) מכיל שיטות ניווט שונות, (3) מבצע השוואות שונות בין רשומות VTD לבין מחרוזות, ו (4) ממיר רשומות VTD לסוגי נתונים פרימיטיביים.
  • AutoPilotHuge מבצע איטרציה ברמת הצומת ו- XPath.

דוגמת קוד[עריכת קוד מקור | עריכה]

/* In this java program, we demonstrate how to use XMLModifier to incrementally
* update a simple XML purchase order.
* a particular name space. We also are going 
* to use VTDGen's parseFile to simplify programming.
*/

import com.ximpleware.*;

public class Update {
      public static void main(String argv[]) throws NavException, ModifyException, IOException{
            // open a file and read the content into a byte array
            VTDGen vg = new VTDGen();
            if (vg.parseFile("oldpo.xml", true)){
                VTDNav vn = vg.getNav();
                AutoPilot ap = new AutoPilot(vn);
                XMLModifier xm = new XMLModifier(vn);
                ap.selectXPath("/purchaseOrder/items/item[@partNum='872-AA']");

                int i = -1;
                while((i=ap.evalXPath())!=-1){
                    xm.remove();
                    xm.insertBeforeElement("<something/>\n"); 
                }
                ap.selectXPath("/purchaseOrder/items/item/USPrice[.<40]/text()");
                while((i=ap.evalXPath())!=-1){
                    xm.updateToken(i,"200");
                }
                xm.output("newpo.xml");
            }
      }
}

הערות שוליים[עריכת קוד מקור | עריכה]