פרסומת
האם תרצה ללמוד כיצד לקרוא ולכתוב קובץ XML מ-Java?
קבצי XML מהו קובץ XML וכיצד ניתן לפתוח ולהשתמש בו?אולי ראית את המונח "XML". אולי אפילו פתחת בטעות קובץ XML. מהו XML וכיצד משתמשים בו? קרא עוד משמשים למגוון מטרות כולל אחסון נתונים. לפני ש-JSON הפך פופולרי, XML היה הפורמט המועדף לייצוג, אחסון והובלה של נתונים מובנים. למרות שהפופולריות של XML דעכה בשנים האחרונות, אתה עלול להיתקל בו מדי פעם ולכן חשוב ללמוד איך לעבוד איתו מקוד.
Java Standard Edition (SE) 10 מושגי ליבה של Java שכדאי ללמוד כשמתחיליםבין אם אתה כותב GUI, מפתח תוכנה בצד השרת או יישום נייד באמצעות אנדרואיד, לימוד Java ישרת אותך היטב. הנה כמה מושגי ליבה של Java שיעזרו לך להתחיל. קרא עוד כולל את Java API לעיבוד XML (JAXP), שהוא מונח גג המכסה את רוב ההיבטים של עיבוד XML. אלו כוללים:
- DOM: מודל אובייקט המסמך כולל מחלקות לעבודה עם חפצי XML כגון אלמנט, צומת, תכונות וכו'. ה-DOM API טוען את מסמך ה-XML המלא לזיכרון לצורך עיבוד, כך שהוא אינו מתאים במיוחד לעבודה עם קבצי XML גדולים.
- SAX: ה-API הפשוט ל-XML הוא אלגוריתם מונחה אירועים לקריאת XML. כאן XML מעובד על ידי אירועי ירי שנמצאו בעת קריאת XML. דרישות הזיכרון לשימוש בשיטה זו נמוכות, אך העבודה עם ה-API מורכבת יותר מאשר העבודה עם ה-DOM.
- StAX: ה- Streaming API for XML הוא תוספת עדכנית ל-XML APIs ומספק סינון, עיבוד ושינוי של זרמים בעלי ביצועים גבוהים של XML. למרות שהוא נמנע מטעינת כל מסמך ה-XML לזיכרון, הוא מספק ארכיטקטורה מסוג pull מאשר ארכיטקטורה מונעת אירועים, כך שקל יותר לקוד ולהבין את האפליקציה מאשר להשתמש ב-SAX ממשק API.
במאמר זה אנו משתמשים ב- DOM API כדי להדגים כיצד לקרוא ולכתוב קבצי XML מ-Java. נעסוק בשני ממשקי ה-API האחרים במאמרים עתידיים.
קובץ XML לדוגמה
לצורך מאמר זה, אנו מדגימים את המושגים באמצעות ה-XML לדוגמה הבא, שניתן למצוא פה:
1.0?>גמברדלה, מתיו מדריך למפתח XML
מַחשֵׁב 44.95 2000-10-01 מבט מעמיק על יצירת יישומים עם XML. רלס, קים ...
קריאת קובץ XML
הבה נבחן את השלבים הבסיסיים הנדרשים לקריאת קובץ XML באמצעות DOM API.
הצעד הראשון הוא לקבל מופע של DocumentBuilder. הבונה משמש לניתוח מסמכי XML. עבור שימוש בסיסי, אנו עושים זאת כך:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder builder = factory.newDocumentBuilder();
כעת נוכל לטעון את כל המסמך לזיכרון החל מאלמנט השורש של XML. בדוגמה שלנו, זה ה קָטָלוֹג אֵלֵמֶנט.
קובץ קובץ =...; // קובץ XML לקריאה. Document document = builder.parse (קובץ); קטלוג אלמנטים = document.getDocumentElement();
וזהו, אנשים! ה-DOM API לקריאת XML הוא ממש פשוט. כעת יש לך גישה לכל מסמך ה-XML החל מאלמנט השורש שלו, קָטָלוֹג. בוא נראה עכשיו איך לעבוד עם זה.
שימוש ב-DOM API
עכשיו שיש לנו את שורש ה-XML אֵלֵמֶנט, נוכל להשתמש ב-DOM API כדי לחלץ גוש מידע מעניין.
קבל את כל סֵפֶר ילדים של אלמנט השורש ומעליהם לולאה. ציין זאת getChildNodes() החזרות את כל ילדים, כולל טקסט, הערות וכו'. למטרה שלנו, אנחנו צריכים רק את האלמנטים של הילד, אז אנחנו מדלגים על האחרים.
NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Node child = books.item (i); if (child.getNodeType() != צומת. ELEMENT_NODE ) המשך; ספר אלמנט = (אלמנט) ילד; // עבוד עם הספר אלמנט כאן. }
איך מוצאים אלמנט ילד ספציפי, בהתחשב בהורה? השיטה הסטטית הבאה מחזירה את האלמנט התואם הראשון אם נמצא, או null. כפי שאתה יכול לראות, ההליך כולל קבלת רשימת צמתים צאצאים ומעבר דרכם בלולאה בבחירת צמתים של אלמנטים עם השם שצוין.
סטטי פרטי צומת findFirstNamedElement (אב צומת, String tagName) { NodeList children = parent.getChildNodes(); for (int i = 0, in = children.getLength(); אני < ב; i++) { Node child = children.item (i); if (child.getNodeType() != צומת. ELEMENT_NODE ) המשך; if ( child.getNodeName().equals (tagName) ) מחזירה ילד; } החזר null; }
שים לב שה-DOM API מתייחס לתוכן טקסט בתוך אלמנט כצומת נפרד מסוג TEXT_NODE. בנוסף, תוכן הטקסט עשוי להיות מפוצל למספר צמתי טקסט סמוכים. אז העיבוד המיוחד הבא נדרש כדי להביא את תוכן הטקסט בתוך אלמנט.
מחרוזת פרטית סטטית getCharacterData (אב צומת) { StringBuilder text = new StringBuilder(); if ( אב == null ) החזר text.toString(); ילדים NodeList = parent.getChildNodes(); for (int k = 0, kn = children.getLength(); k < kn; k++) { Node child = children.item (k); if (child.getNodeType() != צומת. TEXT_NODE ) הפסקה; text.append (child.getNodeValue()); } return text.toString(); }
חמושים בפונקציות הנוחות הללו, הבה נסתכל כעת על קוד כלשהו לפרט מידע מה-XML לדוגמה שלנו. ברצוננו להציג מידע מפורט עבור כל ספר, כזה שיהיה זמין בקטלוג ספרים.
NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Node child = books.item (i); if (child.getNodeType() != צומת. ELEMENT_NODE ) המשך; ספר אלמנט = (אלמנט) ילד; ii++; String id = book.getAttribute("id"); מחבר מחרוזת = getCharacterData (findFirstNamedElement (ילד,"מחבר")); String title = getCharacterData (findFirstNamedElement (ילד,"title")); String genre = getCharacterData (findFirstNamedElement (ילד,"ז'אנר")); מחרוזת מחיר = getCharacterData (findFirstNamedElement (ילד,"מחיר")); מחרוזת pubdate = getCharacterData (findFirstNamedElement (ילד,"pubdate")); String descr = getCharacterData (findFirstNamedElement (ילד,"תיאור")); System.out.printf("%3d. מזהה ספר = %s\n" + " מחבר: %s\n" + " כותרת: %s\n" + " ז'אנר: %s\n" + " מחיר: %s\n" + " תאריך פרסום: %s \n" + " descr: %s\n", ii, id, author, title, genre, price, publicdate, descr); }
כתיבת פלט XML
Java מספקת את XML Transform API כדי להפוך נתוני XML. אנו משתמשים ב-API זה עם ה- שינוי זהות לייצר פלט.
כדוגמה, הבה נוסיף חדש סֵפֶר רכיב לקטלוג לדוגמה המוצג לעיל. פרטי הספר (כגון מְחַבֵּר, כותרת, וכו') ניתן להשיג באופן חיצוני, אולי מקובץ מאפיינים או מסד נתונים. אנו משתמשים בקובץ המאפיינים הבא כדי לטעון את הנתונים.
id=bk113. מחבר=ג'יין אוסטן. title=גאווה ודעה קדומה. ז'אנר=רומנטיקה. מחיר=6.99. publish_date=2010-04-01. description="זו אמת המוכרת בכל העולם, שאדם רווק בעל הון טוב חייב להיות חסר אישה." אז מתחילה הגאווה ודעה קדומה, קומדיה השנונה של ג'יין אוסטן על נימוסים - אחד הרומנים הפופולריים ביותר בכל הזמנים - הכוללת שיח מתורבת להפליא בין מר דארסי הגאה ואליזבת בנט בעלת הדעות הקדומות כשהם משחקים את החיזור הנמרץ שלהם בסדרה של חדרי סלון מהמאה השמונה עשרה תככים.
השלב הראשון הוא לנתח את קובץ ה-XML הקיים בשיטה שהוצגה לעיל. הקוד מוצג גם למטה.
קובץ קובץ =...; // קובץ XML לקריאה. Document document = builder.parse (קובץ); קטלוג אלמנטים = document.getDocumentElement();
אנו טוענים את הנתונים מקובץ המאפיינים באמצעות ה נכסים כיתה מסופקת עם java. הקוד די פשוט ומוצג להלן.
String propsFile =...; Properties props = new Properties(); try (FileReader in = new FileReader (propsFile)) { props.load (in); }
לאחר טעינת המאפיינים, אנו מאחזרים את הערכים שאנו רוצים להוסיף מקובץ המאפיינים.
String id = props.getProperty("id"); מחבר מחרוזת = props.getProperty("author"); String title = props.getProperty("title"); String genre = props.getProperty("genre"); String price = props.getProperty("price"); מחרוזת publish_date = props.getProperty("publish_date"); String descr = props.getProperty("description");
הבה ניצור כעת ריק סֵפֶר אֵלֵמֶנט.
Element book = document.createElement("book"); book.setAttribute("id", id);
הוספת רכיבי הילד ל- סֵפֶר הוא טריוויאלי. מטעמי נוחות, אנו אוספים את שמות האלמנטים הנדרשים ב-a רשימה ולהוסיף את הערכים בלולאה.
רשימהelnames =Arrays.asList("author", "title", "ז'אנר", "price", "publish_date", "description"); עבור (מחרוזת elname: elnames) { Element el = document.createElement (elname); טקסט טקסט = document.createTextNode (props.getProperty (elname)); el.appendChild (טקסט); book.appendChild (אל); } catalog.appendChild (ספר);
וכך זה נעשה. ה קָטָלוֹג לרכיב יש עכשיו את החדש סֵפֶר אלמנט נוסף. כל מה שנותר כעת הוא לכתוב את ה-XML המעודכן.
עבור כתיבת ה-XML, אנו זקוקים למופע של שַׁנַאי אשר נוצר כפי שמוצג להלן. שים לב שאנו מבקשים הזחה של ה-XML של הפלט באמצעות ה- setOutputProperty() שיטה.
TransformerFactory tfact = TransformerFactory.newInstance(); Transformer tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. INDENT, "כן"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3");
השלב האחרון ביצירת פלט ה-XML הוא החלת הטרנספורמציה. התוצאה מופיעה בזרם הפלט, System.out.
tform.transform (DOMSource חדש (מסמך), StreamResult חדש (System.out));
כדי לכתוב את הפלט ישירות לקובץ, השתמש בפריטים הבאים.
tform.transform (DOMSource חדש (מסמך), StreamResult חדש (קובץ חדש ("output.xml")));
וזה מסכם את המאמר הזה על קריאה וכתיבה של קובצי XML באמצעות DOM API.
האם השתמשת ב-DOM API ביישומים שלך? איך זה התפקד? אנא הודע לנו בתגובות למטה.