כיצד לקרוא ולכתוב קבצי XML עם קוד

כיצד לקרוא ולכתוב קבצי XML עם קוד

האם אתה רוצה ללמוד כיצד לקרוא ולכתוב קובץ XML מ- java?





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





מהדורת Java Standard Edition (SE) כוללת את Java API לעיבוד XML (JAXP) , שהוא מונח מטריה המכסה את רוב ההיבטים של עיבוד XML. אלו כוללים:





  • פְּסַק דִין: מודל אובייקט המסמך כולל שיעורים לעבודה עם חפצי XML כגון רכיב, צומת, תכונות וכו '. DOM API טוען את מסמך ה- XML ​​המלא לזיכרון לצורך עיבוד, כך שהוא אינו מתאים במיוחד לעבודה עם קבצי XML גדולים.
  • SAX: ה- API פשוט ל- XML ​​הוא אלגוריתם מונע אירועים לקריאת XML. כאן XML מעובד על ידי ירי אירועים שנמצאו בעת קריאת XML. דרישות הזיכרון לשימוש בשיטה זו נמוכות, אך העבודה עם ה- API מורכבת יותר מעבודה עם ה- DOM.
  • StAX: ה- API של Streaming for XML הוא תוספת עדכנית לממשקי ה- XML ​​של XML ומספקת סינון, עיבוד ושינוי של זרם בעל ביצועים גבוהים. הוא אמנם נמנע מטעינת כל מסמך ה- XML ​​לזיכרון, אך הוא מספק ארכיטקטורה מסוג משיכה ולא ארכיטקטורה מונעת אירועים, כך שהיישום קל יותר לקודד ולהבין אותו מאשר באמצעות ה- SAX API.

במאמר זה אנו משתמשים ב- DOM API כדי להדגים כיצד לקרוא ולכתוב קבצי XML מג'אווה. נעסוק בשני ממשקי ה- API האחרים במאמרים עתידיים.

קובץ XML לדוגמה

לצורך מאמר זה, אנו מדגימים את המושגים באמצעות מדגם ה- XML ​​הבא, אותו ניתן למצוא פה :






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

קריאת קובץ XML

הבה נבחן את השלבים הבסיסיים הנדרשים לקריאת קובץ XML באמצעות DOM API.

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





כיצד לבדוק את מפרט המחשב באמצעות cmd
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

כעת נוכל לטעון את כל המסמך לזיכרון החל מרכיב השורש XML. בדוגמה שלנו, זה ה קָטָלוֹג אֵלֵמֶנט.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

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





שימוש ב- API של DOM

עכשיו שיש לנו את שורש ה- XML אֵלֵמֶנט , אנו יכולים להשתמש ב- DOM API כדי לחלץ גושי מידע מעניינים.

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

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}

כיצד מוצאים אלמנט ילד ספציפי, בהתחשב בהורה? השיטה הסטטית הבאה מחזירה את רכיב ההתאמה הראשון אם הוא נמצא או הוא null. כפי שאתה יכול לראות, ההליך כרוך בהשגת רשימת הצמתים הצאצאים ובאמצעותם בחירת צמתים של רכיבים עם השם שצוין.

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
if ( child.getNodeName().equals(tagName) )
return child;
}
return null;
}

שים לב כי DOM API מתייחס לתוכן טקסט בתוך אלמנט כצומת סוג נפרד TEXT_NODE . בנוסף, תוכן הטקסט עשוי להיות מפוצל למספר צמתי טקסט סמוכים. אז העיבוד המיוחד הבא נדרש כדי להביא את תוכן הטקסט בתוך אלמנט.

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

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

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
ii++;
String id = book.getAttribute('id');
String author = getCharacterData(findFirstNamedElement(child,'author'));
String title = getCharacterData(findFirstNamedElement(child,'title'));
String genre = getCharacterData(findFirstNamedElement(child,'genre'));
String price = getCharacterData(findFirstNamedElement(child,'price'));
String pubdate = getCharacterData(findFirstNamedElement(child,'pubdate'));
String descr = getCharacterData(findFirstNamedElement(child,'description'));
System.out.printf('%3d. book id = %s
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

כתיבת פלט XML

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

כדוגמה, הוסף לנו חדש סֵפֶר אלמנט לקטלוג המדגם המוצג למעלה. פרטי הספר (כגון מְחַבֵּר , כותרת וכו ') ניתן להשיג חיצונית, אולי מקובץ מאפיינים או ממאגר מידע. אנו משתמשים בקובץ המאפיינים הבא כדי לטעון את הנתונים.

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

השלב הראשון הוא לנתח את קובץ ה- XML ​​הקיים בשיטה המוצגת לעיל. הקוד מוצג גם להלן.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

אנו מעמיסים את הנתונים מקובץ המאפיינים באמצעות נכסים שיעור מסופק עם java. הקוד די פשוט ומוצג להלן.

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

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

String id = props.getProperty('id');
String author = props.getProperty('author');
String title = props.getProperty('title');
String genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');

תן לנו כעת ליצור ריק סֵפֶר אֵלֵמֶנט.

הורד סרטון יוטיוב לרול המצלמה של אייפון
Element book = document.createElement('book');
book.setAttribute('id', id);

הוספת רכיבי הילד ל סֵפֶר הוא טריוויאלי. לנוחות, אנו אוספים את שמות האלמנטים הנדרשים ב- רשימה והוסף את הערכים בלולאה.

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

וכך זה מתבצע. ה קָטָלוֹג לרכיב יש כעת את החדש סֵפֶר אלמנט נוסף. כל שנותר כעת הוא לכתוב את ה- XML ​​המעודכן.

בכדי לכתוב את ה- XML, אנו זקוקים למופע של שַׁנַאי אשר נוצר כפי שמוצג להלן. שים לב שאנו מבקשים הכנסת XML הפלט באמצעות setOutputProperty () שיטה.

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-amount', '3');

השלב האחרון ביצירת פלט ה- XML ​​הוא החלת הטרנספורמציה. התוצאה מופיעה בזרם הפלט, System.out .

tform.transform(new DOMSource(document), new StreamResult(System.out));

כדי לכתוב את הפלט ישירות לקובץ, השתמש באפשרויות הבאות.

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

וזה מסכם מאמר זה על קריאה וכתיבה של קבצי XML באמצעות DOM API.

האם השתמשת ב- DOM API ביישומים שלך? איך זה התנהל? אנא יידע אותנו בתגובות למטה.

לַחֲלוֹק לַחֲלוֹק צִיוּץ אימייל Canon לעומת ניקון: איזה מותג מצלמות עדיף?

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

קרא הבא
נושאים קשורים
  • תִכנוּת
  • ג'אווה
על הסופר ג'יי סרידהאר(פורסמו 17 מאמרים) עוד מג'יי סרידהאר

הירשם לניוזלטר שלנו

הצטרף לניוזלטר שלנו לקבלת טיפים, סקירות, ספרים אלקטרוניים בחינם ומבצעים בלעדיים!

לחצו כאן להרשמה