VTD-XML

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

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

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

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

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

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

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

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

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

## פשטות
### כמנתח (Parser)
כאשר נעשה שימוש במצב ניתוח, מטרתו של VTD-XML היא ביצועים גבוהים מאוד. 

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

### כאינדקס
בזכות מיפוי האינדקסים שעושה VTD-XML, מפתחים יכולים לכתוב את הייצוג הפנימי של מסמך XML מנותח לדיסק ולאחר מכן לטעון אותו מחדש כדי למנוע ניתוח חוזר. לשם כך, XimpleWare הציגה פורמט אריזה בינארי המשלב 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.

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

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

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

* לעומת 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 ויכולת עדכון מצטבר הופך את הכרחי כדי להשיג את הרמה הרצויה של איכות השירות עבור יישומי אבטחה של 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. 

ראוי לציין כי מחייב נתונים שנדונו במאמר המוזכר לעיל צריך להיות מיושם על ידי היישום: 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.

## דוגמת קוד

```java
/* 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");
            }
      }
}
```


## קישורים חיצוניים
* 

## הערות שוליים

קטגוריה:XML
קטגוריה:C++
קטגוריה:דפים עם תרגומים שלא נסקרו