ניתוח קובץ XML באמצעות מנתח SAX

1. סקירה כללית

SAX, הידוע גם בשם ה- API פשוט עבור XML, משמש לניתוח מסמכי XML.

במדריך זה נלמד מה זה SAX ולמה, מתי ואיך יש להשתמש בו.

2. SAX: ה- API פשוט ל- XML

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

ממשק ה- API יעיל מכיוון שהוא מפיל אירועים מיד לאחר שהקריבקים קיבלו אותם. לָכֵן, ל- SAX ניהול זיכרון יעיל, שלא כמו DOM, למשל.

3. SAX לעומת DOM

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

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

4. SAX לעומת StAX

StAX הוא חדש יותר מאשר SAX ו- DOM. זה מייצג ממשק API להזרמת XML.

ההבדל העיקרי עם SAX הוא בכך StAX משתמש במנגנון משיכה במקום מנגנון הדחיפה של SAX (באמצעות שיחות חוזרות).

המשמעות היא שהשליטה ניתנת ללקוח להחליט מתי צריך למשוך את האירועים. לכן, אין חובה למשוך את כל המסמך אם יש צורך רק בחלק ממנו.

הוא מספק ממשק API קל לעבודה עם XML עם ניתוח יעיל בזיכרון.

שלא כמו SAX, הוא אינו מספק אימות סכמות כאחת התכונות שלו.

5. ניתוח קובץ ה- XML ​​באמצעות מטפל מותאם אישית

כעת נשתמש ב- XML ​​הבא המייצג את אתר Baeldung ואת מאמריו:

   ניתוח קובץ XML באמצעות מנתח SAX SAX Parser Lorem ipsum ... ניתוח קובץ XML באמצעות DOM Parser DOM Parser Lorem ipsum ... ניתוח קובץ XML באמצעות StAX Parser StAX's Lorem ipsum ... 

נתחיל ביצירת POJOs עבורנו באלדונג יסוד שורש וילדיו:

מעמד ציבורי Baeldung {ArticleList פרטי רשימה; // קבועים וקובעים רגילים} 
בכיתה ציבורית BaeldungArticle {כותרת מחרוזת פרטית; תוכן מחרוזת פרטי; // קבועים וקובעים רגילים} 

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

נעקוף ארבע שיטות ממעמד העל ברירת מחדל, כל אחד מאפיין אירוע:

    • תווים (char [], int, int) מקבל דמויות עם גבולות. נמיר אותם ל- a חוּט ולאחסן אותו במשתנה של BaeldungHandler
    • startDocument () מופעל כאשר הניתוח מתחיל - נשתמש בו כדי לבנות את שלנו באלדונג למשל
    • startElement () מופעל כאשר הניתוח מתחיל עבור אלמנט - נשתמש בו כדי לבנות את אחד מהם רשימה אוֹ BaeldungArticle מקרים - qName עוזר לנו לעשות הבחנה בין שני הסוגים
    • endElement () מופעל כאשר הניתוח מסתיים עבור אלמנט - זה כאשר נקצה את תוכן התגים למשתנים שלהם

עם כל ההגדרות החוזרות, אנו יכולים כעת לכתוב את BaeldungHandler מעמד:

בכיתה ציבורית BaeldungHandler מרחיב את DefaultHandler {פרטית סופית סטרינג מחרוזת ARTICLES = "מאמרים"; סופי סטטי פרטי מחרוזת ARTICLE = "מאמר"; סופי סטטי פרטי מחרוזת TITLE = "כותרת"; סופי סטטי פרטי מחרוזת CONTENT = "content"; אתר פרטי Baeldung; פרטי מחרוזת ElementValue; @ ביטול תווים בטלים ציבוריים (char [] ch, int התחלה, int אורך) זורק SAXException {elementValue = מחרוזת חדשה (ch, התחלה, אורך); } @Override ציבור ריק ריק startDocument () זורק SAXException {אתר = Baeldung חדש (); } @Override public void startElement (מחרוזת uri, String lName, String qName, Attribut attr) זורק SAXException {switch (qName) {מקרה ARTICLES: website.articleList = new ArrayList (); לשבור; מקרה ARTIKEL: website.articleList.add (BaeldungArticle חדש ()); }} @Override public void endElement (מחרוזת uri, מחרוזת localName, מחרוזת qName) זורק SAXException {switch (qName) {case TITLE: latestArticle (). Title = elementValue; לשבור; מקרה תוכן: latestArticle (). content = elementValue; לשבור; }} BaeldungArticle פרטית latestArticle () {List articleList = website.articleList; int latestArticleIndex = articleList.size () - 1; להחזיר articleList.get (latestArticleIndex); } אתר Baeldung getWebsite ציבורי () {אתר החזרה; }} 

קבוצות מיתרים נוספו גם כדי להגביר את הקריאות. שיטה לאחזור המאמר האחרון שנתקלת בו היא גם נוחה. לבסוף, אנו זקוקים לגטר עבור ה- באלדונג לְהִתְנַגֵד.

שים לב שהאמור לעיל אינו בטוח בברגה מכיוון שאנו מחזיקים במצב בין שיחות השיטה.

6. בדיקת המנתח

על מנת לבדוק את המנתח, נפתח את ה- SaxFactory, ה SaxParser וגם את BaeldungHandler:

SAXParserFactory מפעל = SAXParserFactory.newInstance (); SAXParser saxParser = factory.newSAXParser (); SaxParserMain.BaeldungHandler baeldungHandler = SaxParserMain.BaeldungHandler חדש (); 

לאחר מכן ננתח את קובץ ה- XML ​​ונקבע כי האובייקט מכיל את כל האלמנטים הצפויים המנותחים:

saxParser.parse ("src / test / resources / sax / baeldung.xml", baeldungHandler); SaxParserMain.Baeldung result = baeldungHandler.getWebsite (); assertNotNull (תוצאה); מאמרים ברשימה = result.getArticleList (); assertNotNull (מאמרים); assertEquals (3, articles.size ()); SaxParserMain.BaeldungArticle articleOne = articles.get (0); assertEquals ("ניתוח קובץ XML באמצעות מנתח SAX", articleOne.getTitle ()); assertEquals ("לורם איפסום של SAX Parser ...", ArticleOne.getContent ()); SaxParserMain.BaeldungArticle articleTwo = articles.get (1); assertEquals ("ניתוח קובץ XML באמצעות מנתח DOM", articleTwo.getTitle ()); assertEquals ("Lorem ipsum של DOM Parser ...", articleTwo.getContent ()); SaxParserMain.BaeldungArticle articleThree = articles.get (2); assertEquals ("ניתוח קובץ XML באמצעות מנתח StAX", articleThree.getTitle ()); assertEquals ("Lorem ipsum של StAX Parser ...", articleThree.getContent ()); 

כצפוי, ביילדונג נותח כהלכה ומכיל את תת-האובייקטים המיוחלים.

7. מסקנה

בדיוק גילינו כיצד להשתמש ב- SAX לניתוח קבצי XML. זהו ממשק API רב עוצמה המייצר טביעת רגל זיכרון קלה ביישומים שלנו.

כרגיל, הקוד של מאמר זה זמין באתר GitHub.