עבודה עם קבצי XML בג'אווה באמצעות ניתוח DOM

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

במדריך זה נדון כיצד לנתח DOM עם Apache Xerces - ספרייה בוגרת ומבוססת לניתוח / מניפולציה של XML.

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

לקבלת סקירה כללית של תמיכה בספריות XML בג'אווה, עיין במאמר הקודם שלנו.

2. המסמך שלנו

נתחיל עם מסמך ה- XML ​​בו נשתמש בדוגמה שלנו:

   מבוא לגויאבה 04/04/2016 גויאבה מחבר ... 

שים לב שלמסמך שלנו יש צומת שורש שנקרא "הדרכות" עם 4 צמתים לילד "הדרכה". לכל אחד מאלה יש שתי תכונות: "tutId" ו- "type". כמו כן, לכל "הדרכה" יש 4 צמתים לילדים: "כותרת", "תיאור", "תאריך" ו"מחבר ".

כעת נוכל להמשיך בניתוח מסמך זה.

3. טוען קובץ XML

ראשית, עלינו לציין זאת ספריית Apache Xerces ארוזת ב- JDK, כך שלא נצטרך שום הגדרה נוספת.

בואו נקפוץ ישר לטעינת קובץ ה- XML ​​שלנו:

Builder DocumentBuilder = DocumentBuilderFactory.newInstance (). NewDocumentBuilder (); מסמך doc = builder.parse (קובץ חדש ("src / test / resources / example_jdom.xml")); doc.getDocumentElement (). מנרמל ();

בדוגמה שלעיל אנו מקבלים תחילה מופע של ה- DocumentBuilder השתמש בכיתה לְנַתֵחַ() שיטה במסמך XML כדי לקבל מסמך אובייקט המייצג אותו.

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

4. ניתוח ה- DOM

עכשיו, בואו נחקור את קובץ ה- XML ​​שלנו.

נתחיל באחזור כל האלמנטים עם התג "הדרכה". אנו יכולים לעשות זאת באמצעות ה- getElementsByTagName () שיטה, שתחזיר א רשימת צומת:

@Test ציבורי בטל whenGetElementByTag_thenSuccess () {NodeList nodeList = doc.getElementsByTagName ("הדרכה"); צומת ראשונה = nodeList.item (0); assertEquals (4, nodeList.getLength ()); assertEquals (Node.ELEMENT_NODE, first.getNodeType ()); assertEquals ("tutorial", first.getNodeName ()); }

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

לאחר מכן, בואו נראה כיצד נוכל להשיג את תכונות האלמנט הראשון באמצעות getAttributes ():

@Test ציבורי בטל כאשר GetFirstElementAttributes_thenSuccess () {Node first = doc.getElementsByTagName ("tutorial"). Item (0); NamedNodeMap attrList = first.getAttributes (); assertEquals (2, attrList.getLength ()); assertEquals ("tutId", attrList.item (0) .getNodeName ()); assertEquals ("01", attrList.item (0) .getNodeValue ()); assertEquals ("type", attrList.item (1) .getNodeName ()); assertEquals ("java", attrList.item (1) .getNodeValue ()); }

הנה, אנחנו מקבלים את NamedNodeMap ואז השתמש ב- פריט (אינדקס) שיטה לאחזור כל צומת.

עבור כל צומת אנו יכולים להשתמש getNodeName () ו getNodeValue () כדי למצוא את התכונות שלהם.

5. צמתים חוצים

לאחר מכן, בוא נראה כיצד לחצות את צמתי DOM.

במבחן הבא נחצה את צמתי הילד של האלמנט הראשון ונדפיס את תוכנם:

@ מבחן ציבורי בטל כאשר TraverseChildNodes_thenSuccess () {צומת ראשון = doc.getElementsByTagName ("הדרכה"). פריט (0); NodeList nodeList = first.getChildNodes (); int n = nodeList.getLength (); צומת הנוכחי; עבור (int i = 0; i

ראשית, אנו מקבלים את NodeList משתמש ב getChildNodes () שיטה, ואז חזרו דרכה והדפיסו את שם הצומת ותוכן הטקסט.

הפלט יציג את תוכן אלמנט "הדרכה" הראשון במסמך שלנו:

כותרת: תיאור גויאבה: מבוא לתאריך גויאבה: 04/04/2016 מחבר: GuavaAuthor

6. שינוי ה- DOM

אנו יכולים גם לבצע שינויים ב- DOM.

כדוגמה, בואו נשנה את הערך של ה- סוּג תכונה מ- "java" ל"אחר ":

@Test ציבורי בטל כאשרModifyDocument_thenModified () {NodeList nodeList = doc.getElementsByTagName ("הדרכה"); אלמנט ראשון = (Element) nodeList.item (0); assertEquals ("java", first.getAttribute ("סוג")); first.setAttribute ("סוג", "אחר"); assertEquals ("אחר", first.getAttribute ("סוג")); }

כאן, שינוי ערך התכונה הוא עניין פשוט לקרוא ל- אֵלֵמֶנטשל setAttribute () שיטה.

7. יצירת מסמך חדש

מלבד שינוי ה- DOM, אנו יכולים גם ליצור מסמכי XML חדשים מאפס.

בואו נסתכל תחילה על הקובץ שאנחנו רוצים ליצור:

   [מוגן בדוא"ל] 

ה- XML ​​שלנו מכיל משתמשים צומת שורש עם אחד מִשׁתַמֵשׁ אלמנט שיש בו גם צומת ילד אימייל.

כדי להשיג זאת, ראשית עלינו להתקשר ל בּוֹנֶהשל מסמך חדש() שיטה המחזירה א מסמך לְהִתְנַגֵד.

ואז נקרא ל- createElement () שיטת האובייקט החדש:

@Test ציבורי בטל כאשרCreateNewDocument_thenCreated () זורק חריג {Document newDoc = builder.newDocument (); אלמנט שורש = newDoc.createElement ("משתמשים"); newDoc.appendChild (root); אלמנט ראשון = newDoc.createElement ("משתמש"); root.appendChild (ראשון); first.setAttribute ("id", "1"); דוא"ל אלמנט = newDoc.createElement ("דוא"ל"); email.appendChild (newDoc.createTextNode ("[מוגן באמצעות דוא"ל])); first.appendChild (דוא"ל); assertEquals (1, newDoc.getChildNodes (). getLength ()); assertEquals ("משתמשים", newDoc.getChildNodes (). פריט (0) .getNodeName ()); }

כדי להוסיף כל אלמנט ל- DOM, אנו קוראים גם ל- appendChild () שיטה.

8. שמירת מסמך

לאחר שינוי המסמך שלנו או יצירת מסמך מאפס, נצטרך לשמור אותו בקובץ.

נתחיל ביצירת DOMSource ואז להשתמש בפשט שַׁנַאי לשמירת המסמך בקובץ:

חלל פרטי saveDomToFile (מסמך מסמך, שם מחרוזת) זורק חריג {DOMSource dom = DOMSource חדש (מסמך); שנאי שנאי = TransformerFactory.newInstance () .newTransformer (); תוצאת StreamResult = StreamResult חדש (קובץ חדש (fileName)); transformer.transform (dom, תוצאה); }

באופן דומה, אנו יכולים להדפיס את המסמך שלנו במסוף:

חלל פרטי printDom (מסמך מסמך) זורק חריג {DOMSource dom = DOMSource חדש (מסמך); שנאי שנאי = TransformerFactory.newInstance () .newTransformer (); transformer.transform (dom, StreamResult חדש (System.out)); }

9. מסקנה

במאמר מהיר זה למדנו כיצד להשתמש בניתוח DOM של Xerces ליצירת, שינוי ושמירת מסמך XML.

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


$config[zx-auto] not found$config[zx-overlay] not found